Duvida Boba mais nao custa nada saber

Delphi

05/10/2003

Se no meu sistema eu uso esta rotina:

if variavel =True then begin
BiBtn1.click;
end else begin
BiBtn2.click;
end;

e passo a usar esta com menos bytes:

if variavel =True then
BiBtn1.click
else
BiBtn2.click;

o meu sistema vai diminuir alguma coisa da memoria?
Ou da´ no mesmo. tanto faz de uma maneira como da outra?

Diante mao agradeco a ajuda...


Adonis

Adonis

Curtidas 0

Respostas

Glauberms

Glauberms

05/10/2003

Não sei se a diferença entre esses códigos é encarada da mesma forma pelo compilador DELPHI mas sei que pequenas diferenças podem resultar em aumento (ou queda) de desempenho.

No código:

[i:6860376f27][b:6860376f27]i := i + 1;[/b:6860376f27][/i:6860376f27]

o compilador faz a soma da variável [i:6860376f27][b:6860376f27]i[/b:6860376f27][/i:6860376f27] com o número inteiro [i:6860376f27][b:6860376f27]1[/b:6860376f27][/i:6860376f27];

Já no código:

[i:6860376f27][b:6860376f27]Inc(i)[/b:6860376f27][/i:6860376f27]

o compilador resolve isto [b:6860376f27]incrementando[/b:6860376f27] (não somando) [i:6860376f27][b:6860376f27]1[/b:6860376f27][/i:6860376f27] à variável [i:6860376f27][b:6860376f27]i[/b:6860376f27][/i:6860376f27].

As diferenças entre as funções é melhor vista em ASSEMBLY...


No caso de suas funções deve ser melhor (não tenho certeza) a segunda opção já que o uso de [i:6860376f27][b:6860376f27]begin...end[/b:6860376f27][/i:6860376f27] reserva um intervalo de instruções para a operação [i:6860376f27][b:6860376f27]if[/b:6860376f27][/i:6860376f27]. Pode ser tambem que o compilador verifique que as funções são iquais e gere apenas uma resposta para seu código.

Obs: Na dúvida utilize sempre o melhor código pois sei que no meu exemplo a segunda opção ([i:6860376f27][b:6860376f27]Inc(i)[/b:6860376f27][/i:6860376f27]) gera uma código bem mais rápido.

Obs: Melhor que isso só programando em ASSEMBLY.


GOSTEI 0
Glauberms

Glauberms

05/10/2003

...
Obs: Na dúvida, utilize sempre o [u:3115b762a1][b:3115b762a1]menor[/b:3115b762a1][/u:3115b762a1] código pois sei que no meu exemplo a segunda opção ([i:3115b762a1][b:3115b762a1]Inc(i)[/b:3115b762a1][/i:3115b762a1]) gera uma código bem mais rápido.
...


GOSTEI 0
Ljr

Ljr

05/10/2003

Acho que nao ira alterar drasticamente o desempenho e o tamanho de seu programa.

Arrisco até em falar que vc nem irá perceber alteração!!!

Não tenho nenhuma informação técnica a respeito, mas acho que o compilador aloca o que está entre o begin e end para um ponto do programa (especie de um label), daí quando a variavel for verdadeira ele chama tal ponto do programa caso contrario chama outro ponto. Depois é que iria buscar os comandos.

Ja se vc nao usar ele ira chamar o procedimento diretamente, o que implica em uma ´melhor performance´.

Mas como eu disse, eu so suspeito disso. Nao tenho nenhuma informação tecnica.

Talvez ajude.


GOSTEI 0
Beppe

Beppe

05/10/2003

No código: i := i + 1; o compilador faz a soma da variável i com o número inteiro 1; Já no código: Inc(i)


O compilador do Delphi é inteligente o suficiente para identificar x := x + 1, x := Succ(x); e transformar num Inc(I);

Abraçar uma única instrução com begin/end naum afeta o código gerado.
B/E é uma unidade síntática apenas.

Você pode retirar o teste variavel = True e deixar apenas:

  if variavel then


esta sim é uma otimização, em que uma linguagem conservativa como Pascal não pode realizar por si só!

PS: Para verificar as estatísticas do projeto, acesse Project | Information for..., sempre que fizer uma otimização. Mas lembre-se, código menor nem sempre é o mais rápido.


GOSTEI 0
Adonis

Adonis

05/10/2003

:D agradeco as ajudas acima...


GOSTEI 0
POSTAR