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.Join
Posso 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.