2014-10-30 3 views
0

Есть ли способ улучшить скорость/эффективность этого метода? Он называется десятками тысяч раз в моем коде и замедляет работу системы, которую я разрабатываю.Общие проблемы с частотой при сравнении строк с использованием RegEx

В принципе, «Поле» имеет «имя» и «значение», и мне нужно проверить, совпадает ли оно с именем/значением соответствующего свойства в моем классе. Поле. Значение также может быть регулярным выражением. Я предполагаю, что регулярное выражение замедляет работу.

private bool FieldMatch(Field field) 
    { 
     var propValue = GetPropertyValue(field.Name); 
     var regEx = new Regex(field.Value, RegexOptions.IgnoreCase); 
     var stringMatch = string.Compare(propValue, field.Value, StringComparison.InvariantCultureIgnoreCase) 
     return (stringMatch == 0) || regEx.IsMatch(propValue); 
    } 
+3

Проходит ли тот же самый 'field.Value' в несколько раз? Раньше я обнаружил, что построение объекта «Regex» может быть медленным, поэтому, если вы можете кэшировать его экземпляры для данного выражения, это может улучшить производительность. –

+0

Так что я мог бы предварительно скомпилировать RegEx в экземпляре класса Field , возможно? – jimbo

+0

Вы можете заменить значение регулярным выражением, которое будет создано только один раз. Или иметь кэш или регулярные выражения, если значения не будут сильно отличаться. – Vinzz

ответ

1

У меня есть два решения этой проблемы.

Один добавить предварительно скомпилированных Regex к классу поля следующим образом:

public class Field 
{ 

    public string Name { get; set; } // Should ultimately be an enum. 

    public string Value { get; set; } 

    public Regex RegexValue 
    { 
     get { 
      return _regexValue ?? (_regexValue = 
       new Regex(Value, RegexOptions.Compiled | RegexOptions.IgnoreCase)); 
     } 
    } 

    private Regex _regexValue; 

} 

private bool FieldMatch(Field field) 
{ 
    var propValue = GetPropertyValue(field.Name); 
    var stringMatch = string.Compare(propValue, field.Value, StringComparison.InvariantCultureIgnoreCase); 
    return (stringMatch == 0) || field.RegexValue.IsMatch(propValue); 
} 

Другой заключается в использовании статического Regex так:

private bool FieldMatch(Field field) 
    { 
     var propValue = GetPropertyValue(field.Name); 
     var stringMatch = string.Compare(propValue, field.Value,      StringComparison.InvariantCultureIgnoreCase); 
     return (stringMatch == 0) || Regex.IsMatch(propValue, field.Value); 
    } 

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

+1

+1. Выглядит неплохо. Как вы говорите, вам нужно будет сделать некоторые тесты, чтобы узнать, что более подходит. Я подозреваю, что первый, как вы говорите, тот же «Поле» используется потенциально сотни раз –

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