Ir para conteúdo
  • Cadastre-se

dev botao
  • Este tópico foi criado há 3752 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Consultores
Postado

   Muitos tem visto que o código dependendo do tamanho do BD do seu cliente algumas operações podem ficar muito lentas. Em especial notamos isso na geração dos arquivos como SPED e Sintegra.

 

   Então, na medida do possível, estou analisando aqui alguns métodos que são muitas vezes utilizados e podem fazer grande diferença no código para otimizá-los, fazendo-os serem executados com o mínimo de tempo possível.

 

  Especificamente neste caso, as vezes o problema está na constante alocação de memória e redimensionamento das strings.

 

Vejam um exemplo o código do método ACBrUtil.TiraPontos. O método atual é executado várias vezes nos registros Sintegra.

A seguinte linha abaixo causa realocação de memória ao redimensionar a string xStr toda vez que é executada:

xStr := xStr + str[i]

Podemos remover essa realocação por inicializar a string no começo e apenas redimensioná-la no final. Nos meus testes isso reduziu o tempo de execução em pouco mais de 80%. Quer dizer, se você utiliza esse método várias vezes chegando ao tempo total de aproximadamente 1,33 segundos, o tempo gasto depois de corrigido é de menos de 0,23 segundos. :geek::ph34r:

 

Criei o projeto abaixo para demonstrar como isso pode afetar o código quando é executado muitas vezes. Assim outros podem testar e ver a otimização.

program project;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  ACBrUtil,
  Diagnostics;

function TiraPontosX(Str: string): string;
const
  InvalidChars : set of char =
  ['/',',','-','.',')','(',',',' '];
var
  i, Count: Integer;
begin
  SetLength(Result, Length(str));
  Count := 0;
  for i := 1 to Length(str) do
  begin
    if not (str[i] in InvalidChars) then
    begin
      inc(Count);
      Result[Count] := str[i];
    end;
  end;
  SetLength(Result, Count);

end;


var
 st1: TStopwatch;
 c: Extended;
 s: string;
 I,N: Integer;
begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
    st1 := TStopwatch.Create;

    for N := 1 to 3 do
    begin
      st1.Start;
      for I := 0 to 3000000 do
      begin
        s := ACBrUtil.TiraPontos('0.0');
      end;
      st1.Stop;

      c := st1.ElapsedMilliseconds;

      Writeln(FloatToString(c));
      st1.Reset;
    end;


    for N := 1 to 3 do
    begin
      st1.Start;
      for I := 0 to 3000000 do
      begin
        s := TiraPontosX('0.0');
      end;
      st1.Stop;

      c := st1.ElapsedMilliseconds;

      Writeln(FloatToString(c));
      st1.Reset;
    end;

    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

Aproveitei para adicionar alguns testes para esse método específico e não causar nenhum problema ao inserir a otimização. (:

 

Essa não é uma mudança que resolve todos os problemas. O método precisa ser chamado muitas vezes para começarmos a ver diferenças. Mas se fizermos isso com mais funções, com certeza teremos uma execução muito mais rápida.

 

Conseguindo fazer o mesmo com outros métodos avisarei aqui nesse tópico.

  • Curtir 5

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...
The popup will be closed in 10 segundos...