Как сравнить производительность методов сравнения строк в 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 в основном преобразуется в случай ==, и производительность будет намного лучше. Если время выполнения - это всего лишь совокупность по большому количеству сравнений с разными тестовыми значениями, то эта техника не будет работать.

Источник: http://csharphelper.com/blog/2017/02/compare-the-performance-of-string-comparison-methods-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector