Duvida Boba mais nao custa nada saber
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...
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
Curtidas 0
Respostas
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.
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
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.
...
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
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.
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
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
05/10/2003
:D agradeco as ajudas acima...
GOSTEI 0