Ускорение сопоставления с датой - PullRequest
0 голосов
/ 05 октября 2011

Я пишу некоторый простой код, который пытается определить, является ли конкретная строка на самом деле датой Java, и, если да, определить ее формат (шаблон).

Очевидно, что из-за того, что существует много возможных форматов даты, установление того, какой из них применим для строки, требует последовательного сопоставления с шаблоном, что действительно требует много времени и ресурсов процессора, учитывая, что входная строка может иметь и другие значения.

Итак, то, что я закончил, для строковой переменной с именем input, похоже на

String datePattern;

if (isLikeDate(input))
{
    datePattern = matchAnyOfThePredefinedDatePatterns(input);
}

, где метод isLike... отклоняет очевидные строки без даты, а метод match... обрабатывает около 40-50 предопределенных шаблонов, пытаясь создать допустимый объект SimpleDateFormat. Конструктор выдает исключение, если строка input не является допустимой датой для образца, проверяемого каждый раз.

Обработка исключений значительно замедляет процесс, но, похоже, избежать этого невозможно. Пакеты Apache Commons Date демонстрируют аналогичную производительность.

Есть ли более быстрый способ реализации сопоставления с датой?

Ответы [ 3 ]

1 голос
/ 05 октября 2011

Вы можете подумать о создании конечного автомата, похожего на игру в пачинко с входящей строкой.Это не получится относительно быстро для не дат - в основном парсера грамматики даты.

Не уверен, будет ли всегда быстрее или быстрее - достаточно, чтобы стоить усилий.

1 голос
/ 05 октября 2011

match ... метод проходит около 40-50 предопределенных шаблонов, пытаясь создать действительный объект SimpleDateFormat.

Означает ли это, что вы создаете новые SimpleDateFormat объекты при каждом вызове match? Это довольно дорого, не делай этого.

Сохранить объекты формата, ранее построенные. Если я правильно помню, SimpleDateFormat.parse() не является потокобезопасным, поэтому потребуется дополнительная работа.

Конечно, вы хотите сначала попробовать форматы с более высокими шансами на успех, но я не знаю, есть ли у вас такое представление о шаблонах данных.

1 голос
/ 05 октября 2011

В зависимости от сложности шаблонов, вы можете захотеть сопоставить каждый потенциальный шаблон с регулярным выражением (или рукописным кодом) перед тем, как попытается правильно проанализировать его как дату. Например, если шаблон «yyyyMMddThh: mm: ss», вы можете проверить длину, позицию T, позицию двоеточий и все остальное - это цифра, прежде чем передавать ее в код синтаксического анализа даты.

Этот уровень сопоставления с образцом может быть очень либеральным - он только пытается исключить определенные нарушения образца. Важно то, что он не отклоняет любые значения, которые на самом деле действительны .

Недостатком является то, что для любого паттерна, который соответствует , вы выполняете работу дважды - но это все равно может быть легко сбалансировано за счет значительного сокращения количества исключений, которые вы выбрасываете.

РЕДАКТИРОВАТЬ: просто чтобы уточнить, вы в настоящее время проверяете, выглядит ли он как любой шаблонов, а затем тестируете все из них. Я полагаю, что у вас есть регулярное выражение для каждого шаблона, и попробуйте выполнить анализ только для шаблонов, которые уже соответствуют соответствующему регулярному выражению.

Я бы также предложил попробовать Joda Time - он не только вообще лучше API, но и его шаблоны поточнобезопасны, так что вы можете использовать их повторно. Предположительно в настоящее время вы создаете новые SimpleDateFormat объекты каждый раз, когда вам есть что анализировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...