Tutorial de otimização de código Delphi:
Otimização de strings
Delphi tem três tipos de string: string curta (string[n], n=1..255) A área de armazenamento é alocada estaticamente e o tamanho é determinado em tempo de compilação. Isso é herdado de bp para. O tipo de array de caracteres dos; (pchar) é principalmente para compatibilidade com várias APIs. Ele apareceu no bp7 e agora é mais amplamente usado no Delphi. Sua área de armazenamento pode ser alocada estaticamente com um array de caracteres ou manualmente com getmem. String de caracteres longos (antistring) é exclusiva do Delphi. Sua área de armazenamento é alocada dinamicamente em tempo de execução, que é o mais flexível e mais suscetível a abusos.
O tipo de string padrão do Delphi, AnsiString, será automaticamente inicializado como vazio sem inicialização repetida. O seguinte código:
Delphi tem três tipos de string: string curta (string[n], n=1..255) A área de armazenamento é alocada estaticamente e o tamanho é determinado em tempo de compilação. Isso é herdado de bp para. O tipo de array de caracteres dos; (pchar) é principalmente para compatibilidade com várias APIs. Ele apareceu no bp7 e agora é mais amplamente usado no Delphi. Sua área de armazenamento pode ser alocada estaticamente com um array de caracteres ou manualmente com getmem. String de caracteres longos (antistring) é exclusiva do Delphi. Sua área de armazenamento é alocada dinamicamente em tempo de execução, que é o mais flexível e mais suscetível a abusos.
vars:string;
começar
s:=;
…
fim;
s:=; é desnecessário. Mas é importante notar que isso não afeta o resultado do valor de retorno da função. De modo geral, passar argumentos var é mais rápido do que retornar um valor de string.
Usar SetLength para pré-alocar uma string longa (AnsiString) para alocar memória dinamicamente é uma grande vantagem do AnsiString, mas pode facilmente ser autodestrutivo. Um exemplo típico é o seguinte:
s2:= ;
para i:=2 para comprimento(s1) faça s2:=s2+s1[i];
Sem falar que pode ser substituído por delete. O principal problema é que a área de memória de s2 é alocada repetidamente no loop do exemplo acima, o que consome bastante tempo. Uma maneira simples e eficaz é a seguinte:
definir comprimento(s2,comprimento(s1)-1);
para i:=2 para comprimento(s1) faça s2[i-1]:=s1[i];
Desta forma, a memória s2 será realocada apenas uma vez.
Segurança de threads de strings e arrays dinâmicos Antes do Delphi 5, essas chamadas não thread-safe para operações em arrays dinâmicos e strings longas usavam contagem de referência para lidar com seus problemas críticos. No entanto, desde o Delphi 5, elas foram alteradas diretamente para algumas operações. Prefixe as instruções críticas com a instrução de bloqueio para evitar esse problema. Infelizmente, esta modificação é bastante cara, porque a instrução de bloqueio no processador Pentium II é bastante demorada e são necessários cerca de 28 ciclos de instrução adicionais para concluir esta operação, de modo que a eficiência geral é reduzida em pelo menos metade. Só existe uma maneira de resolver esse problema: modificar o código principal do delphi rtl. Após fazer backup do arquivo original, substitua todos os bloqueios em source/rtl/sys/system.pas por {lock}. Claro, a palavra inteira deve ser substituída. Isso ainda não foi totalmente otimizado. A próxima etapa é remover a instrução xchg que também está incluída na biblioteca de tempo de execução delphi4. Como esta instrução tem um prefixo de bloqueio implícito, o xchg edx nos processos _lstrasg e _strlasg em system.pas. ser removido. Substitua [eax] pelo seguinte código:
mov ecx, [eax]
mov[eax],edx
mov edx,ecx
ok, pronto, basta compilá-lo e sobrescrever system.dcu. Desta forma, sua eficiência de execução será 6 vezes maior que o delphi5 e 2 vezes maior que o delphi4.