String.Join problema de desempenho em c #

Eu tenho pesquisado uma questão que me foi apresentada: Como escrever uma função que usa uma string como entrada e retorna uma string com espaços entre os caracteres. A função deve ser escrita para otimizar o desempenho quando é chamada de milhares de vezes por segundo.

Eu sei que .net tem uma função chamadaString.Join, para o qual eu posso passar no caractere de espaço como um separador junto com a string original.

Restringindo o uso deString.JoinPosso usar oStringBuilder classe para acrescentar espaços após cada caractere.

Outra maneira de realizar essa tarefa é declarar uma matriz de caracteres com 2 * n-1 caracteres (você deve adicionar n-1 caracteres para os espaços). O array de caracteres pode ser preenchido em um loop e depois passado para o Stringconstructor.

Eu escrevi algum código .net que executa cada um desses algoritmos um milhão de vezes cada com o parâmetro"Hello, World" e mede quanto tempo demora para executar. O método (3) é muito, muito mais rápido que (1) ou (2).

Eu sei que (3) deve ser muito rápido, pois evita a criação de quaisquer referências de string adicionais para serem coletadas como lixo, mas parece-me que uma função interna de .net comoString.Join deve render bom desempenho. Por que está usandoString.Join muito mais lento do que fazer o trabalho manualmente?

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

Atualizar:Eu mudei meu projeto para o modo "Release" e atualizei meus tempos decorridos na questão de acordo.

questionAnswers(6)

yourAnswerToTheQuestion