comparacao de stringUma situacao bem corriqueira no dia-a-dia, principalmente quando se esta trabalhando com algum tipo de parser, e codificar testes condicionais com mais do que uma validacao onde ha comparacoes string.var lFailed: Boolean; lText: string;begin ... if (lText = '') and (not lFailed) then ...end;No exemplo acima o primeiro teste do "if" faz uma comparacao entre string e o segundo e uma comparacao que envolve uma variavel booleana.Sabendo que uma comparacao entre string e uma tarefa "onerosa" para o processador, o mais sensato e alterarmos a ordem das condicoes de forma que os testes mais simples sejam atendidos primeiros. Isso evita, nesse nosso exemplo, uma comparacao de string desnecessaria quando a variavel lFailed for False.Esse e um tipo de Boas Praticas de Programacao pode ser extentido para casos de forma geral que exigam um processamento extra.Redundancia de chamadasPor mais otimizado que a biblioteca do Delphi esteja, a chamada a uma funcao de manipulacao de string sempre impoem alguma penalidade se comparado com operacoes simples, e evitar chamadas desnecessarias ou redundantes certamente e um cuidado bem vindo.O codigo abaixo e um pequeno trecho retirado de uma metodo de validacao de email. Podemos notar o uso repetido e redundante da funcao "Pos".function IsValidEmail(const EMail: string): Boolean;begin ... if (Pos('@', EMail) <> 0) and (Pos('.', EMail) <> 0) then begin if (Pos('@', EMail) = 1) or (Pos('@', EMail) = Length(EMail)) or (Pos('.', EMail) = 1) or (Pos('.', EMail) = Length(EMail)) or (Pos(' ', EMail) = 0) then Result := False ...Esse e um exemplo simples que utiliza funcoes especificas para tratamento de strings, mas o problema nao e exclusivo e estende-se para qualquer outro tipo de redundancia.function IsValidEmail(const EMail: string): Boolean;var lPos_Dot: Integer; lPos_Arroba: Integer;begin ... lPos_Dot := Pos('.', EMail); lPos_Arroba := Pos('@', EMail); if (lPos_Arroba <> 0) and (lPos_Dot <> 0) then begin if (lPos_Arroba = 1) or (lPos_Arroba = Length(EMail)) or (lPos_Dot = 1) or (lPos_Dot = Length(EMail)) or (Pos(' ', EMail) = 0) then Result := False ...A simples adicao de duas variaveis locais evitou quatro chamadas desnecessarias a funcao "Pos".Verificando se uma string esta vaziaExistem muitas maneiras de conferir se uma string e ou nao vazia, mas voce sabe qual delas e a mais eficiente?Abaixo eu apresento tres das formas mais frequentemente empregadas.var lMyStr: string;begin lMyStr := Caption; if lMyStr = '' then lMyStr := 'Maneira mais eficiente'; if Length(lMyStr) = 0 then lMyStr := 'Maneira menos eficiente'; if lMyStr[1] = '' then lMyStr := 'Forma desaconselhada';Para entender melhor a verdadeira razao do primeiro if conter a forma mais adequada de verificar se um string esta ou nao vazia, vou postar o codigo assemble gerado pelo compilador. Mesmo voce nao estando familiarizado com a linguagem assembly, tenho certeza que sera facil o entendimento.O codigo gerado pelo compilador e apresentado logo abaixo da linha do codigo fonte respectiva e cada um dos if acima esta destacado em uma cor diferente.fuStrTest.pas.127: if lMyStr = '' then07992023 837DFC00 cmp dword ptr [ebp-$04],$0007992027 750D jnz $07992036fuStrTest.pas.128: lMyStr := 'Maneira mais eficiente';07992029 8D45FC lea eax,[ebp-$04]0799202C BADC209907 mov edx,$079920dc07992031 E842F0FFFF call $07991078fuStrTest.pas.129: if Length(lMyStr) = 0