2013-11-29 3 views
3

Я читал this статью на dotnetperls.com о regular expressions, когда я прочитал следующее: (курсив мой)Почему статический RegEx медленнее, чем экземпляр RegEx?

... мы видим, что с помощью Regex экземпляр объекта быстрее, чем при использовании static Regex.Match. Для производительности вы всегда должны использовать экземпляр объекта.

я ожидал бы, что с помощью метода static будет быстрее, потому что я подозреваю, что они делают regex.match идентичны, но экземпляр нуждается в инициализации (который занимает много времени, конечно).

После некоторых поисков я, по крайней мере, узнал, что (часть) мое чувство кишки было прав. Что касается статических методов, this dotnerperls статье говорится: (курсив мой)

Статические методы нет экземпляров. Они вызываются с именем типа, а не идентификатором экземпляра. Они немного быстрее, чем методы экземпляра из-за этого.

Но тогда почему экземпляр RegEx будет быстрее, чем статический класс?

+3

Посмотрите на этот ответ http://stackoverflow.com/questions/414328/using-static-regex-ismatch-vs-creating-an-instance-of-regex – BudBrot

+1

@Pengu, спасибо, что ответ отвечает на мой вопрос также. Что касается человека, который дал мне закрытый голос. Я хотел бы отметить, что вопросы не совпадают. Связанный вопрос задает вопрос, следует ли использовать 'static' или' instance', а мой - почему 'static' быстрее. Тот факт, что принятый ответ также отвечает на мой вопрос, удачен, но это не делает этот вопрос дубликатом. – Jordy

ответ

2

Для соответствия статическому регулярному выражению объект Regex должен преобразовать ваш шаблон в структуру, которая может быть выполнена (путем создания внутреннего экземпляра Regex), и необходимо выполнить поиск строки, которую вы передаете в Match, дополнительно для этого внутренний экземпляр Regex кэшируется, чтобы обеспечить более быстрое выполнение последующих вызовов. Таким образом, первый раз, когда вы выполнить статическое Совпадение времени, затрачиваемое приблизительно:

  • Проверка кэш Regex для многократного использования, например (не обнаружит один)
  • создавать внутреннюю REGEX экземпляра экземпляр
  • Cache Regex
  • Execute матч

Последующие вызовы более или менее:

  • Проверка кэша Regex для многократного использования, например (найти один)
  • Выполнить Match, используя кэшированные экземпляр

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

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

+0

Хороший ответ с быстрой ссылкой, особенно для указания, что информация о статической производительности в основном теоретически. Я также хотел бы посоветовать людям, у которых также был этот вопрос, прочитать принятый ответ в ссылке для более подробного объяснения кэширования RegEx. – Jordy

Смежные вопросы