String.Join проблема производительности в C #

Я исследовал вопрос, который мне задавали: как написать функцию, которая принимает строку в качестве входных данных и возвращает строку с пробелами между символами. Функция должна быть написана для оптимизации производительности, когда она вызывается тысячи раз в секунду.

I know that .net has a function called String.Join, to which I may pass in the space character as a separator along with the original string.

Barring the use of String.Join, I can use the StringBuilder class to append spaces after each character.

Another way to accomplish this task is to declare a character array with 2*n-1 characters (You have to add n-1 characters for the spaces). The character array can be filled in a loop and then passed to the String constructor.

Я написал некоторый код .net, который запускает каждый из этих алгоритмов по миллиону раз с параметром."Hello, World" и измеряет, сколько времени требуется, чтобы выполнить. Метод (3) намного, намного быстрее, чем (1) или (2).

Я знаю, что (3) должен быть очень быстрым, потому что он избегает создания каких-либо дополнительных строковых ссылок для сбора мусора, но мне кажется, что встроенная функция .net, такая какString.Join должен дать хорошую производительность. Почему используетсяString.Join намного медленнее, чем делать работу вручную?

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);
    }

Update: &nbsp;Я изменил свой проект на «Выпуск» режим и обновил мои истекшие времена в вопросе соответственно.