Tecnologia além do código.
Régys Borges da Silveira

Performance em Strings no Delphi: O Guia Definitivo entre Concatenação e TStringBuilder

Neste artigo 9 tópicos

O uso de strings é uma das operações mais elementares em qualquer aplicação Delphi. No entanto, a forma como manipulamos esses dados pode ser a diferença entre um sistema fluido e um que sofre com latência excessiva e fragmentação de memória.

Neste artigo, vamos descer ao nível dos bits para entender o comportamento do gerenciador de memória do Delphi e estabelecer critérios técnicos sobre quando utilizar a concatenação tradicional e quando migrar para o TStringBuilder.

O Funcionamento das Strings e o Custo do Gerenciamento de Memória

Para entender a diferença, precisamos lembrar que as strings no Delphi (UnicodeString) são tipos de referência com contagem de referências, mas com uma característica crucial: elas são logicamente imutáveis quando sofrem alteração de tamanho.

Ao concatenar duas strings usando o operador +, o Delphi não apenas “pendura” o novo texto ao final do antigo. O processo envolve:

  1. Localização de Espaço: O Memory Manager (FastMM) precisa encontrar um bloco contíguo de memória que comporte a soma das duas strings.
  2. Alocação: Um novo bloco de memória é alocado na Heap.
  3. Cópia: O conteúdo da primeira e da segunda string é copiado para o novo endereço.
  4. Liberação: A string antiga é liberada (ou sua contagem de referência é decrementada).

Em loops de milhares de iterações, esse ciclo de “aloca-copia-libera” gera uma pressão enorme no gerenciador de memória, resultando em fragmentação de memória (Heap Fragmentation). Em sistemas long-running (como servidores), isso pode levar ao erro EOutOfMemory mesmo com RAM disponível, simplesmente por não haver um bloco contíguo grande o suficiente.

TStringBuilder: A Estratégia de Bufferização

O TStringBuilder (unit System.SysUtils) aborda o problema de forma distinta. Em vez de criar uma nova string a cada modificação, ele reserva um buffer interno mutável.

A grande vantagem reside na propriedade Capacity. Se você prevê que o resultado final terá 1MB, você pode inicializar o objeto já com essa reserva:

SB := TStringBuilder.Create(1024 * 1024); // Reserva 1MB de imediato

Isso reduz o número de realocações de NN para uma única alocação, eliminando o custo computacional de cópias sucessivas.

Análise de Complexidade Algorítmica (Big O)

A diferença de performance é explicada matematicamente pela Notação Big O:

  • Operador + (O(n2))(O(n^2)): Em um loop, a cada iteração ii, você copia todos os caracteres acumulados. A carga de trabalho cresce de forma quadrática conforme o número de concatenações aumenta.
  • TStringBuilder (O(n))(O(n)): Como as inserções ocorrem em um buffer pré-existente (com expansões geométricas ocasionais), o custo médio de cada adição é constante, resultando em uma complexidade linear.

Comparativo Técnico: Prós e Contras

CritérioConcatenação Comum (+)TStringBuilder
Tipo de DadoValor (Referência gerenciada)Objeto (Classe na Heap)
MutabilidadeImutável (Gera nova cópia)Mutável (Buffer interno)
Custo de InstalaçãoZero (Nativo do compilador)Elevado (Criação de objeto)
GerenciamentoAutomático (ARC)Manual (Try..Finally)
Thread-SafetySeguro (Copy-on-Write)Não-seguro (Requer sincronia)
Ideal para…Pequenas junções e UI simplesLoops, JSON, XML e SQL extensos

Deslize a tabela para os lados para ver todas as colunas.

Quando usar cada abordagem?

O Cenário do Operador +

Não existe “bala de prata”. O TStringBuilder é uma classe, e instanciar um objeto envolve alocação na Heap, inicialização da VMT (Virtual Method Table) e gerenciamento de ciclo de vida. Para concatenar 3 ou 4 strings curtas, o overhead de criar o objeto é maior do que o benefício da performance. Use + quando a legibilidade for prioridade e o volume de dados for baixo.

O Cenário do TStringBuilder

A vantagem real começa a aparecer após a décima concatenação consecutiva ou quando o volume de dados ultrapassa alguns kilobytes. É indispensável em:

  • Construção de comandos SQL complexos via código.
  • Serialização manual de JSON ou XML.
  • Processamento de arquivos de texto linha a linha.

Conclusão

A regra de ouro da engenharia de software no Delphi é: utilize o operador + para o cotidiano e a interface do usuário, mas mude para o TStringBuilder assim que identificar um loop ou processamento de dados volumosos. Conhecer o que acontece nos bastidores da memória é o que separa um código funcional de um código de alta performance.

Referênciass

CANTÙ, Marco. Object Pascal Handbook. 1. ed. Piacenza: CreateSpace Independent Publishing Platform, 2015.

EMBARCADERO. Internal Data Formats (Delphi): UnicodeString. Disponível em: https://docwiki.embarcadero.com/RADStudio/en/Internal_Data_Formats_(Delphi)#UnicodeString_Types. Acesso em: 30 abr. 2026.

EMBARCADERO. System.SysUtils.TStringBuilder. Disponível em: https://docwiki.embarcadero.com/Libraries/en/System.SysUtils.TStringBuilder. Acesso em: 30 abr. 2026.

THORPE, Danny. Delphi Component Design. Indianapolis: New Riders, 1996. (Fundamentos de gerenciamento de memória em Object Pascal).

Compartilhar por e-mail

0 comentário(s)

Dê-nos sua opinião, seu comentário ajuda o site a crescer e melhorar a qualidade dos artigos.

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.

Um próximo passo para cada interesse.

Continue estudando com os livros, acompanhe as videoaulas ou consulte as soluções para o seu projeto.

Descubra mais sobre Régys Borges da Silveira

Assine agora mesmo para continuar lendo e ter acesso ao arquivo completo.

Continuar lendo