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: Я изменил свой проект на «Выпуск» режим и обновил мои истекшие времена в вопросе соответственно.