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 намного медленнее, чем делать работу вручную?

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

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

Ответы на вопрос(6)

Ваш ответ на вопрос