Sim, a diferença de desempenho é significativa. Consulte o artigo da KB " Como melhorar o desempenho da concatenação de cadeias de caracteres no Visual C # ".
Eu sempre tentei codificar para obter clareza primeiro e depois otimizar o desempenho posteriormente. Isso é muito mais fácil do que fazer o contrário! No entanto, tendo visto a enorme diferença de desempenho em meus aplicativos entre os dois, agora penso nisso com um pouco mais de cuidado.
Felizmente, é relativamente simples executar uma análise de desempenho no seu código para ver onde você está gastando o tempo e modificá-lo para usá-lo StringBuilder
quando necessário.
Para esclarecer o que Gillian disse sobre 4 cordas, se você tiver algo parecido com isto:
então seria mais rápido usando strings e o operador plus. Isso ocorre porque (como Java, como Eric aponta), ele usa internamente o StringBuilder automaticamente (na verdade, ele usa uma primitiva que o StringBuilder também usa)
No entanto, se o que você está fazendo é mais próximo:
Então você precisa usar explicitamente um StringBuilder. O .Net não cria automaticamente um StringBuilder aqui, porque seria inútil. No final de cada linha, "a" deve ser uma sequência (imutável), para que seja necessário criar e dispor um StringBuilder em cada linha. Para velocidade, você precisará usar o mesmo StringBuilder até concluir a construção:
fonte
a
for uma variável local e o objeto que ele referenciar não tiver sido atribuído a alguma outra variável (que pode ser acessível a outro encadeamento), um bom otimizador poderá determinar quea
não é acessado por nenhum outro código durante essa sequência de linhas; apenas o valor final dasa
questões. Portanto, poderia tratar essas três linhas de código como se elas fossem escritasa = b + c + d;
.É preferível o StringBuilder se você estiver executando vários loops ou bifurcações na sua passagem de código ... no entanto, para obter um desempenho PURE, se você puder se safar com uma declaração de string ÚNICA , será muito mais eficiente.
Por exemplo:
tem mais desempenho que
Nesse caso, StringBuild pode ser considerado mais sustentável, mas não tem mais desempenho do que a declaração de string única.
9 vezes em 10, no entanto ... use o construtor de strings.
Em uma nota lateral: string + var também é mais eficiente que a string.Format (geralmente) que usa um StringBuilder internamente (em caso de dúvida ... verifique o refletor!)
fonte
Um exemplo simples para demonstrar a diferença de velocidade ao usar
String
concatenação vsStringBuilder
:Resultado:
Resultado:
Como resultado, a primeira iteração levou 15423 ms enquanto a segunda iteração usando
StringBuilder
levou 10 ms.Parece-me que o uso
StringBuilder
é mais rápido, muito mais rápido.fonte
Essa referência mostra que a concatenação regular é mais rápida ao combinar 3 ou menos seqüências de caracteres.
http://www.chinhdo.com/20070224/stringbuilder-is-not-always-faster/
O StringBuilder pode fazer uma melhoria muito significativa no uso da memória, especialmente no caso de adicionar 500 strings.
Considere o seguinte exemplo:
O que acontece na memória? As seguintes seqüências de caracteres são criadas:
Adicionando esses cinco números ao final da string, criamos 13 objetos de string! E 12 deles eram inúteis! Uau!
StringBuilder corrige esse problema. Não é uma "sequência mutável", como costumamos ouvir ( todas as sequências no .NET são imutáveis ). Funciona mantendo um buffer interno, uma matriz de caracteres. Chamar Append () ou AppendLine () adiciona a string ao espaço vazio no final da matriz de caracteres; se a matriz for muito pequena, ela cria uma nova matriz maior e copia o buffer lá. Portanto, no exemplo acima, o StringBuilder pode precisar apenas de uma única matriz para conter todas as 5 adições à string - dependendo do tamanho do buffer. Você pode dizer ao StringBuilder qual o tamanho do buffer no construtor.
fonte
i.ToString()
. Portanto, com o StringBuilder, você ainda precisa criar 6 + 1 strings; reduziu a criação de 13 strings para a criação de 7 strings. Mas essa ainda é a maneira errada de encarar; a criação das seis seqüências numéricas não é relevante. Bottom line: você simplesmente não deveria ter mencionado as seis strings criadas pori.ToString()
; eles não fazem parte da comparação de eficiência.Sim,
StringBuilder
oferece melhor desempenho ao executar operações repetidas em uma string. Isso ocorre porque todas as alterações são feitas em uma única instância, para economizar muito tempo, em vez de criar uma nova instância comoString
.String Vs Stringbuilder
String
System
espaço para nomeStringBuilder
(sequência mutável)System.Text
espaço para nomefonte
String Vs String Builder:
A primeira coisa que você precisa saber é: em que assembléia essas duas classes vivem?
Assim,
string está presente no
System
espaço para nome.e
StringBuilder está presente no
System.Text
espaço para nome.Para declaração de string :
Você precisa incluir o
System
espaço para nome. algo assim.Using System;
e
Para declaração StringBuilder :
Você precisa incluir o
System.text
espaço para nome. algo assim.Using System.text;
Agora venha a pergunta real.
Qual é a diferença entre string e StringBuilder ?
A principal diferença entre esses dois é que:
string é imutável.
e
StringBuilder é mutável.
Então agora vamos discutir a diferença entre imutável e mutável
Mutável:: significa Mutável.
Imutável:: significa Não Alterável.
Por exemplo:
Então, neste caso, vamos mudar o mesmo objeto 5 vezes.
Então a pergunta óbvia é essa! O que realmente acontece sob o capô, quando trocamos a mesma corda 5 vezes.
É o que acontece quando mudamos a mesma string 5 vezes.
vamos olhar para a figura.
Explicação:
Quando inicializamos essa variável "name" para "Rehan", ou seja,
string name = "Rehan"
essa variável é criada na pilha "name" e aponta para o valor "Rehan". depois que esta linha é executada: "name = name +" Shah ". a variável de referência não está mais apontando para o objeto" Rehan ", agora está apontando para" Shah "e assim por diante.O mesmo
string
vale para o significado imutável de que, uma vez que criamos o objeto na memória, não podemos alterá-lo.Então, quando concatenamos a
name
variável, o objeto anterior permanece lá na memória e outro objeto de cadeia é criado ...Portanto, a partir da figura acima, temos cinco objetos, os quatro objetos são jogados fora e não são usados. Eles ainda permanecem na memória e ocupam a quantidade de memória. "Garbage Collector" é responsável por isso, para limpar os recursos da memória.
Portanto, no caso de string a qualquer momento, quando manipulamos a string repetidamente, temos muitos objetos Criados e permanecemos lá na memória.
Então essa é a história da string Variable.
Agora vamos olhar para o objeto StringBuilder. Por exemplo:
Então, neste caso, vamos mudar o mesmo objeto 5 vezes.
Então a pergunta óbvia é essa! O que realmente acontece sob o capô, quando mudamos o mesmo StringBuilder 5 vezes.
É o que acontece quando alteramos o mesmo StringBuilder 5 vezes.
vamos olhar para a figura.
Explicação: No caso do objeto StringBuilder. você não receberia o novo objeto. O mesmo objeto será alterado na memória, portanto, mesmo que você altere o objeto e digamos 10.000 vezes, ainda teremos apenas um objeto stringBuilder.
Você não possui muitos objetos de lixo ou objetos string_uilder não referenciados porque pode ser alterado. É mutável, ou seja, muda ao longo do tempo?
Diferenças:
fonte
StringBuilder reduz o número de alocações e atribuições, com um custo de memória extra usada. Utilizado corretamente, ele pode remover completamente a necessidade do compilador alocar cadeias cada vez maiores até que o resultado seja encontrado.
vs.
fonte
Fonte: MSDN
fonte
StringBuilder
é melhor para criar uma sequência a partir de muitos valores não constantes.Se você estiver construindo uma sequência a partir de muitos valores constantes, como várias linhas de valores em um documento HTML ou XML ou outros trechos de texto, poderá anexar apenas a mesma sequência, porque quase todos os compiladores fazem isso. "dobragem constante", um processo de redução da árvore de análise quando você tem um monte de manipulação constante (também é usado quando você escreve algo parecido
int minutesPerYear = 24 * 365 * 60
). E para casos simples com valores não constantes anexados um ao outro, o compilador .NET reduzirá seu código para algo semelhante ao queStringBuilder
faz.Mas quando seu anexo não puder ser reduzido a algo mais simples pelo compilador, você desejará a
StringBuilder
. Como salienta, é mais provável que isso aconteça dentro de um loop.fonte
Eu acredito que o StringBuilder é mais rápido se você tiver mais de 4 strings que você precisa acrescentar. Além disso, ele pode fazer algumas coisas legais como o AppendLine.
fonte
No .NET, o StringBuilder ainda é mais rápido que o acréscimo de cadeias. Tenho certeza de que, em Java, eles apenas criam um StringBuffer sob o capô quando você anexa strings, então não há realmente nenhuma diferença. Não sei por que eles ainda não fizeram isso no .NET.
fonte
Considere ' A triste tragédia do teatro de micro-otimização '.
fonte
O uso de seqüências de caracteres para concatenação pode levar a uma complexidade de tempo de execução na ordem de
O(n^2)
.Se você usar a
StringBuilder
, há muito menos cópia da memória que precisa ser feita. Com oStringBuilder(int capacity)
você pode aumentar o desempenho se puder estimar o tamanho da finalString
. Mesmo se você não for preciso, provavelmente precisará aumentar a capacidadeStringBuilder
algumas vezes, o que também pode ajudar no desempenho.fonte
Vi ganhos de desempenho significativos ao usar a
EnsureCapacity(int capacity)
chamada de método em uma instância deStringBuilder
antes de usá-la para qualquer armazenamento de string. Eu costumo chamar isso na linha de código após a instanciação. Tem o mesmo efeito como se você instanciasse oStringBuilder
seguinte:Essa chamada aloca a memória necessária antecipadamente, o que causa menos alocações de memória durante várias
Append()
operações. Você precisa adivinhar qual a quantidade de memória necessária, mas para a maioria dos aplicativos isso não deve ser muito difícil. Geralmente erro do lado de muita memória (estamos falando 1k ou mais).fonte
EnsureCapacity
logo após aStringBuilder
instanciação. Basta instanciar oStringBuilder
assim:var sb = new StringBuilder(int capacity)
.Além das respostas anteriores, a primeira coisa que sempre faço ao pensar em problemas como esse é criar um pequeno aplicativo de teste. Dentro deste aplicativo, realize algum teste de sincronismo nos dois cenários e veja por si mesmo qual é o mais rápido.
IMHO, anexando mais de 500 entradas de string deve definitivamente usar o StringBuilder.
fonte
String e StringBuilder são realmente imutáveis, o StringBuilder possui buffers que permitem gerenciar seu tamanho com mais eficiência. Quando o StringBuilder precisa ser redimensionado é quando é re-alocado no heap. Por padrão, ele é dimensionado para 16 caracteres, você pode configurá-lo no construtor.
por exemplo.
StringBuilder sb = novo StringBuilder (50);
fonte
A concatenação de cadeias custará mais. Em Java, você pode usar StringBuffer ou StringBuilder com base em sua necessidade. Se você deseja uma implementação sincronizada e segura de thread, vá para StringBuffer. Isso será mais rápido que a concatenação de String.
Se você não precisa de implementação sincronizada ou segura de thread, vá para StringBuilder. Isso será mais rápido que a concatenação de String e também mais rápido que StringBuffer, pois não há sobrecarga de sincronização.
fonte
StringBuilder é provavelmente preferível. O motivo é que ele aloca mais espaço do que o necessário atualmente (você define o número de caracteres) para deixar espaço para anexos futuros. Os anexos futuros que se encaixam no buffer atual não exigem nenhuma alocação de memória ou coleta de lixo, o que pode ser caro. Em geral, eu uso o StringBuilder para concatentação de cadeias complexas ou formatação múltipla, depois converto para uma String normal quando os dados estão completos e quero um objeto imutável novamente.
fonte
Se você estiver fazendo muita concatenação de cadeias, use um StringBuilder. Ao concatenar com uma String, você cria uma nova String a cada vez, usando mais memória.
Alex
fonte
Como regra geral, se eu tiver que definir o valor da sequência mais de uma vez ou se houver anexos à sequência, será necessário que ele seja um construtor de sequência. Eu já vi aplicativos que escrevi no passado antes de aprender sobre construtores de strings que tiveram uma enorme pegada de memória que parece continuar crescendo e crescendo. Alterar esses programas para usar o construtor de strings reduz significativamente o uso de memória. Agora juro pelo construtor de cordas.
fonte
Minha abordagem sempre foi usar o StringBuilder ao concatenar 4 ou mais seqüências de caracteres OU Quando não sei como podem ocorrer as concatenações.
Artigo relacionado ao bom desempenho aqui
fonte
StringBuilder
é significativamente mais eficiente, mas você não verá esse desempenho, a menos que esteja realizando uma grande quantidade de modificações em cadeias.Abaixo está um rápido trecho de código para dar um exemplo do desempenho. Como você pode ver, você realmente começa a ver um grande aumento de desempenho quando entra em iterações grandes.
Como você pode ver, as 200.000 iterações levaram 22 segundos, enquanto as 1 milhão de iterações que utilizavam o
StringBuilder
foram quase instantâneas.Resultado do código acima:
fonte
O StringBuilder terá um desempenho melhor, do ponto de vista da memória. Quanto ao processamento, a diferença no tempo de execução pode ser insignificante.
fonte