Разница в производительности между объявлением регулярное выражение внутри или снаружи часто называемый метод.


Мне любопытно, что производительность/функциональные различия между:

private bool OftenCalledMethod(string s)
{
    Regex reg = new Regex(@"^matchme$", RegexOptions.IgnoreCase);
    return (reg.IsMatch(s));
}

Против:

readonly Regex reg = new Regex(@"^matchme$", RegexOptions.IgnoreCase);
private bool OftenCalledMethod(string s)
{
    return (reg.IsMatch(s));
}

Ли компилятор оптимизировать бывший таким образом, что это не имеет значения? Или объекта Рег выделяется неоднократно и безосновательно?



283
1
c#
задан 14 июля 2011 в 03:07 Источник Поделиться
Комментарии
3 ответа

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

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

Запустив профайлер необходимо для оптимизации вашего кода. Есть некоторые вещи, которые всегда может быть плохим (О(П^3) алгоритмы, например), но я знаю по опыту, что я не могу сказать, просто глядя, где время тратится в мой код. Профиль и увидеть, что вы узнаете.

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

2
ответ дан 14 июля 2011 в 03:07 Источник Поделиться

Просто создание класса regex вряд ли займет слишком много времени. Вы просто инициализировать два свойства.

Не путайте инициализацию с гораздо более дорогим исполнением.

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

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

1
ответ дан 14 июля 2011 в 07:07 Источник Поделиться

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

Что касается стоимости инициализации и использования объектов regex, я лично не знаком с C#'ы обращения с ними, но в Python, есть стоимость, чтобы создать регулярное выражение, которое выходит за рамки просто инициализировать несколько переменных-членов.

import re
from timeit import Timer

test_str = 'abra, abra, cadabra'
test_re = 'c.d'

def inside(s):
r = re.compile(test_re)
return r.match(s)

r = re.compile(test_re)
def outside(s):
return r.match(s)

print "inside =", Timer("inside(test_str)", "from __main__ import inside, test_str").timeit()
print "outside =", Timer("outside(test_str)", "from __main__ import outside, test_str").timeit()

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

inside = 3.24013303367
outside = 1.45581882614

1
ответ дан 15 июля 2011 в 06:07 Источник Поделиться