String.Join problema de rendimiento en C #

He estado investigando una pregunta que se me presentó: cómo escribir una función que toma una cadena como entrada y devuelve una cadena con espacios entre los caracteres. La función se debe escribir para optimizar el rendimiento cuando se llama miles de veces por segundo.

Sé que .net tiene una función llamadaString.Join, a la que puedo pasar el carácter de espacio como separador junto con la cadena original.

Salvo el uso deString.Join, Puedo usar elStringBuilder Clase para añadir espacios después de cada personaje.

Otra forma de realizar esta tarea es declarar una matriz de caracteres con 2 * n-1 caracteres (tiene que agregar n-1 caracteres para los espacios). La matriz de caracteres se puede completar en un bucle y luego pasar a la cadenaconstructor.

He escrito un código .net que ejecuta cada uno de estos algoritmos un millón de veces cada uno con el parámetro"Hello, World" y mide el tiempo que tarda en ejecutarse. El método (3) es mucho, mucho más rápido que (1) o (2).

Sé que (3) debería ser muy rápido porque evita la creación de cualquier referencia de cadena adicional para ser recolectada, pero me parece que una función .net incorporada comoString.Join Debería rendir buen rendimiento. Porque esta usandoString.Join ¿Mucho más lento que hacer el trabajo a mano?

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

Actualizar:Cambié mi proyecto al modo "Liberar" y actualicé mis tiempos transcurridos en la pregunta correspondiente.

Respuestas a la pregunta(6)

Su respuesta a la pregunta