Suponha que eu tenha um construtor de string em C # que faça isso:
StringBuilder sb = new StringBuilder();
string cat = "cat";
sb.Append("the ").Append(cat).(" in the hat");
string s = sb.ToString();
isso seria tão eficiente ou mais eficiente quanto ter:
string cat = "cat";
string s = String.Format("The {0} in the hat", cat);
Se sim, por quê?
EDITAR
Após algumas respostas interessantes, percebi que provavelmente deveria ter sido um pouco mais claro no que estava perguntando. Eu não estava perguntando o que era mais rápido na concatenação de uma string, mas o que é mais rápido ao injetar uma string em outra.
Nos dois casos acima, quero injetar uma ou mais seqüências no meio de uma sequência de modelo predefinida.
Desculpe pela confusão
string s = "The "+cat+" in the hat";
pode ser o mais rápido, a menos que seja usado em um loop; nesse caso, o mais rápido será com umaStringBuilder
inicializada fora do loop.Respostas:
NOTA: Esta resposta foi escrita quando o .NET 2.0 era a versão atual. Isso pode não se aplicar a versões posteriores.
String.Format
usa umStringBuilder
internamente:O código acima é um trecho do mscorlib, então a pergunta se torna "é
StringBuilder.Append()
mais rápida queStringBuilder.AppendFormat()
"?Sem benchmarking, eu provavelmente diria que o exemplo de código acima seria executado mais rapidamente
.Append()
. Mas é um palpite, tente fazer benchmarking e / ou criar um perfil dos dois para obter uma comparação adequada.Este sujeito, Jerry Dixon, fez alguns testes comparativos:
Atualizada:
Infelizmente, o link acima morreu desde então. No entanto, ainda há uma cópia no Way Back Machine:
No final do dia, depende se a formatação de sua string será chamada repetidamente, ou seja, você está executando um processamento de texto sério com mais de cem megabytes de texto ou se está sendo chamado quando um usuário clica em um botão de vez em quando. A menos que você esteja executando um trabalho enorme de processamento em lote, eu continuaria com o String.Format, isso ajuda na legibilidade do código. Se você suspeitar de um gargalo de desempenho, cole um criador de perfil no seu código e veja onde ele realmente está.
fonte
.ToString()
oStringBuilder
objeto. Em muitas iterações, esse tempo faz uma grande diferença e significa que ele não está comparando maçãs com maçãs. Essa é a razão pela qual ele mostra um desempenho tão bomStringBuilder
e provavelmente explica sua surpresa. Acabei de repetir o benchmark corrigindo esse erro e obtive os resultados esperados: oString
+
operador foi mais rápido, seguido porStringBuilder
,String.Format
trazendo a retaguarda.Na documentação do MSDN :
fonte
Fiz alguns benchmarks de desempenho rápidos e, para 100.000 operações com média de 10 execuções, o primeiro método (String Builder) leva quase metade do tempo do segundo (String Format).
Portanto, se isso não é frequente, não importa. Mas se for uma operação comum, convém usar o primeiro método.
fonte
Eu esperaria String.Format a ser mais lento - tem que analisar a cadeia e , em seguida, concatenar-lo.
Algumas notas:
fonte
Na maioria dos casos, acho que essa clareza, e não a eficiência, deve ser sua maior preocupação. A menos que você esteja esmagando toneladas de cordas ou construindo algo para um dispositivo móvel de baixa potência, isso provavelmente não prejudicará sua velocidade de execução.
Descobri que, nos casos em que estou criando cadeias de maneira bastante linear, fazer concatenações diretas ou usar o StringBuilder é a melhor opção. Eu sugiro isso nos casos em que a maioria da string que você está construindo é dinâmica. Como muito pouco do texto é estático, o mais importante é que fique claro onde cada parte do texto dinâmico está sendo colocada, caso seja necessário atualizar no futuro.
Por outro lado, se você está falando de um grande pedaço de texto estático com duas ou três variáveis, mesmo que seja um pouco menos eficiente, acho que a clareza que você obtém da string.Format faz valer a pena. Eu usei isso no início desta semana quando tive que colocar um bit de texto dinâmico no centro de um documento de 4 páginas. Será mais fácil atualizar esse grande pedaço de texto se estiver em uma peça do que precisar atualizar três peças que você concatena.
fonte
Se apenas porque string.Format não faz exatamente o que você imagina, aqui está uma reprise dos testes 6 anos depois no Net45.
Concat ainda é o mais rápido, mas na verdade é menos de 30% de diferença. StringBuilder e Format diferem em apenas 5-10%. Eu tenho variações de 20% executando os testes algumas vezes.
Milissegundos, um milhão de iterações:
A lição que retiro é que a diferença de desempenho é trivial e, portanto, não deve impedi-lo de escrever o código legível mais simples possível. O que para o meu dinheiro é frequente, mas nem sempre
a + b + c
.fonte
String.Format usa
StringBuilder
internamente ... tão logicamente que leva à idéia de que seria um pouco menos eficiente devido a mais sobrecarga. No entanto, uma simples concatenação de strings é o método mais rápido de injetar uma string entre outras duas ... em um grau significativo. Essa evidência foi demonstrada por Rico Mariani em seu primeiro Teste de Desempenho, anos atrás. Fato simples é que as concatenações ... quando o número de partes da string é conhecido (sem limitação .. você pode concatenar mil partes ... desde que saiba sempre que sempre há 1000 partes) ... é sempre mais rápido queStringBuilder
ou String. Formato. Eles podem ser executados com uma única alocação de memória e uma série de cópias de memória. Aqui está a provaE aqui está o código real para alguns métodos String.Concat, que chamam FillStringChecked, que usa ponteiros para copiar memória (extraída via Reflector):
Então:
Aproveitar!
fonte
Ah, também, o mais rápido seria:
fonte
StringBuilder
que é feito para otimizar esse tipo de codificação em primeiro lugar.Isso realmente depende. Para cadeias pequenas com poucas concatenações, é realmente mais rápido apenas anexá-las.
Mas para cadeias maiores (cadeias muito muito grandes), é mais eficiente usar o StringBuilder.
fonte
Nesse caso, eu sugeriria que String.Format é o mais rápido porque é projetado para esse fim exato.
fonte
Realmente depende do seu padrão de uso.
A referência detalhada entre
string.Join
,string,Concat
estring.Format
pode ser encontrada aqui: String.Format não é adequado para Logging Intensivofonte
Eu sugeriria que não, já que String.Format não foi projetado para concatenação, ele foi projetado para formatar a saída de várias entradas, como uma data.
fonte