String.Join-Leistungsproblem in C #

Ich habe eine Frage untersucht, die mir gestellt wurde: Wie schreibe ich eine Funktion, die eine Zeichenfolge als Eingabe verwendet und eine Zeichenfolge mit Leerzeichen zwischen den Zeichen zurückgibt? Die Funktion muss geschrieben werden, um die Leistung zu optimieren, wenn sie Tausende Male pro Sekunde aufgerufen wird.

Ich weiß, dass .net eine Funktion namens hatString.Join, an die ich das Leerzeichen als Trennzeichen mit der ursprünglichen Zeichenfolge übergeben darf.

Ausschluss der Verwendung vonString.JoinIch kann das benutzenStringBuilder Klasse, um Leerzeichen nach jedem Zeichen anzufügen.

Eine andere Möglichkeit, diese Aufgabe auszuführen, besteht darin, ein Zeichenarray mit 2 * n-1 Zeichen zu deklarieren (Sie müssen n-1 Zeichen für die Leerzeichen hinzufügen). Das Zeichen-Array kann in einer Schleife gefüllt und dann an den String übergeben werdenconstructor.

Ich habe einen .NET-Code geschrieben, der jeden dieser Algorithmen millionenfach mit dem Parameter ausführt"Hello, World" und misst, wie lange die Ausführung dauert. Methode (3) ist sehr viel schneller als (1) oder (2).

Ich weiß, dass (3) sehr schnell sein sollte, da es vermeidet, zusätzliche Zeichenfolgenverweise zu erstellen, die nicht mit Garbage Collected-Inhalten versehen werden. Mir scheint jedoch, dass eine eingebaute .net-Funktion wieString.Join sollte eine gute Leistung erbringen. Warum wird verwendetString.Join viel langsamer als die Arbeit von Hand?

<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>

Aktualisieren:Ich habe mein Projekt in den "Release" -Modus geändert und meine verstrichenen Zeiten in der Frage entsprechend aktualisiert.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage