String.Join problem z wydajnością w C #

Badałem pytanie, które zostało mi przedstawione: jak napisać funkcję, która pobiera ciąg znaków jako dane wejściowe i zwraca ciąg znaków ze spacjami między znakami. Funkcja ma być zapisana w celu zoptymalizowania wydajności, gdy nazywa się ją tysiące razy na sekundę.

Wiem, że .net ma funkcję o nazwieString.Join, do którego mogę przekazać znak spacji jako separator wraz z oryginalnym łańcuchem.

Zakaz używaniaString.Join, Mogę użyćStringBuilder klasa do dodawania spacji po każdym znaku.

Innym sposobem wykonania tego zadania jest zadeklarowanie tablicy znaków z 2 * n-1 znakami (Musisz dodać n-1 znaków do spacji). Tablica znaków może zostać wypełniona w pętli, a następnie przekazana do ciąguconstructor.

Napisałem kod .net, który uruchamia każdy z tych algorytmów milion razy każdy za pomocą parametru"Hello, World" i mierzy, jak długo trwa wykonanie. Metoda (3) jest dużo, dużo szybsza niż (1) lub (2).

Wiem, że (3) powinno być bardzo szybkie, ponieważ pozwala uniknąć tworzenia dodatkowych referencji łańcuchowych do zbierania śmieci, ale wydaje mi się, że wbudowana funkcja .net, taka jakString.Join powinien dawać dobre wyniki. Dlaczego używamString.Join o wiele wolniej niż wykonując pracę ręcznie?

<code>public static class TestClass
{
    // 491 milliseconds for 1 million iterations
    public static string Space1(string s) 
    {            
        return string.Join(" ", s.AsEnumerable());
    }

    //190 milliseconds for 1 million iterations
    public static string Space2(string s) 
    {
        if (s.Length < 2)
            return s;
        StringBuilder sb = new StringBuilder();
        sb.Append(s[0]);
        for (int i = 1; i < s.Length; i++)
        {
            sb.Append(' ');
            sb.Append(s[i]);
        }            
        return sb.ToString();
    }

    // 50 milliseconds for 1 million iterations
    public static string Space3(string s) 
    {
        if (s.Length < 2)
            return s;
        char[] array = new char[s.Length * 2 - 1];
        array[0] = s[0];
        for (int i = 1; i < s.Length; i++)
        {
            array[2*i-1] = ' ';
            array[2*i] = s[i];
        }
        return new string(array);
    }
</code>

Aktualizacja:Zmieniłem projekt na tryb „Release” i odpowiednio zaktualizowałem czas, który upłynął w pytaniu.

questionAnswers(6)

yourAnswerToTheQuestion