Wprowadzenie

Jest to kolejny z cyklu krótkich wpisów dotyczących wydajności pisanego kodu. Jeżeli chcecie zapoznać się z wprowadzeniem i/oraz poprzednim arykułem zapraszam do poprzedniego wpisu: C# - String Split

Test porównawczny

W tym wpisie skupimy się na porównaniu następujących sposobów łączenia łańcuchów znaków:

  • string interpolation (interpolacja łańcuchów);
  • string format (formatowanie łańcuchów);
  • string concat (konkatencja łańcuchów);
  • string builder (tworzenie łańcuchów).

Napiszemy krótki test pozwalający na porównianie wydajności wyżej wymienionych metod, które będą operowały na tym samym łańcuchu znaków. Czas każdego z wykonań zostanie zmierzony z pomocą klasy Stopwatch a wyniki wyświetlone na konsoli:

static void Main(string[] args)
{
    string firstPart = "Audi RS6 C7 zostało zapreznetowane w roku 2013";
    string secondPart = "W pod koniec 2015 roku Audi zaprezentowało wzmocnioną odmianę o nazwie RS6 Performance.";
    string result = String.Empty;

    // using System.Diagnostics;
    Stopwatch stopwatch = new Stopwatch();

    // String Interpolation
    stopwatch.Start();
    result = $"{firstPart} {secondPart} W tej wersji RS6 posiada 605 KM i do 100 km/h przyspiesza w 3,7 s";
    Console.WriteLine("Interpolacja: " + stopwatch.ElapsedTicks.ToString());

    // String Format
    stopwatch.Restart();
    result = String.Format("{0} {1} W tej wersji RS6 posiada 605 KM i do 100 km/h przyspiesza w 3,7 s", firstPart, secondPart);
    Console.WriteLine("String.Format: " + stopwatch.ElapsedTicks.ToString());

    // String Concat
    stopwatch.Restart();
    result = String.Concat(firstPart, secondPart, "W tej wersji RS6 posiada 605 KM i do 100 km/h przyspiesza w 3,7 s");
    Console.WriteLine("String.Concat: " + stopwatch.ElapsedTicks.ToString());

    // String Builder
    stopwatch.Restart();
    // using System.Text
    StringBuilder sb = new StringBuilder();
    sb.Append(firstPart);
    sb.Append(secondPart);
    sb.Append("W tej wersji RS6 posiada 605 KM i do 100 km/h przyspiesza w 3,7 s");
    Console.WriteLine("StringBuilder: " + stopwatch.ElapsedTicks.ToString());

    Console.ReadKey();
}

Podsumowanie

Jako rezultat wykonania powyższego kodu możemy zobaczyć: Różne sposoby łączenia łańcuchów w języku C#

Wyniki pokazują, że najszybszym typem łączenia łańcuchów znaków jest String.Concat. Możecie powiedzieć, że różnice są niewielkie – pamiętajcie jednak, że motywem przewodnim tej serii artykułów jest optymalizacja w przypadku przetwarzania 20 milionów rekordów – zaoszczędzenie kilku milisekund na jednej operacji daje niewyobrażalne rezultaty w przypadku tak ogormnej ilości danych.