Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 3503 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.