Как сравнить производительность методов сравнения строк в C#
В этом примере используется следующий код для создания четырех строк:
string value0 = "AAAAAAAAAAAAAAAAAAAAAA"; string value1 = "AAAAAAAAAAAAAAAAAAAAAA"; string value2 = "AAAAAAAAAAAAAAAAAAAAAB"; string value3 = "BAAAAAAAAAAAAAAAAAAAAA";
Затем он использует несколько методов для сравнения первой строки с другими. Например, для сравнения строк используется следующий код: ==.
start_time = DateTime.Now; for (int i = 1; i <= iterations; i++) { if (value0 == value1) { } if (value0 == value2) { } if (value0 == value3) { } } elapsed = DateTime.Now - start_time; txtEqEq.Text = elapsed.TotalSeconds.ToString("0.000") + " sec";
В следующем фрагменте кода показаны операторы, которые программа использует для выполнения различных сравнений. Последние три метода выполняют нечувствительные к регистру сравнения. (Я объединил их всех в одном месте здесь. Они не все вместе в коде.)
if (value0 == value1) { } if (String.Compare(value0, value1, false) == 0) { } if (value0.Equals(value1)) { } if (String.Compare(value0, value1, true) == 0) { } if (value0.Equals(value1, StringComparison.CurrentCultureIgnoreCase)) { } if (value0.ToLower() == value1) { }
Из результатов видно, что == дает самую быструю производительность, за которой следует .Equals. Метод String.Compare был намного медленнее.
Я думаю, что причина == настолько велика, что C# обрабатывает строки. Когда вы создаете строку в .NET, она интернирована и помещается в основной пул . Позже, если вы создадите еще одну строку, содержащую тот же текст, новая строка относится к тому же экземпляру в станем пуле. Это позволяет сравнительно быстро и легко сравнивать две строки.
Среди тестов без учета регистра, String.Equals дал самую быструю производительность. Преобразование тестовой строки в нижний регистр для каждой итерации было довольно медленным, однако, если вам нужно сравнить строку со многими другими значениями, и вы можете преобразовать тестовую строку в нижний регистр только один раз перед всеми тестами, то ToLower в основном преобразуется в случай ==, и производительность будет намного лучше. Если время выполнения - это всего лишь совокупность по большому количеству сравнений с разными тестовыми значениями, то эта техника не будет работать.