为什么用汇编的速度没有用pascal快???(0分)

  • 主题发起人 主题发起人 menzhe
  • 开始时间 开始时间
M

menzhe

Unregistered / Unconfirmed
GUEST, unregistred user!
program Proj29;

{$APPTYPE CONSOLE}

uses
SysUtils,windows;

procedure swapa;

var
s:cardinal;
begin
asm mov ecx ,100000000
xor eax,eax
@s: add eax,1
loop @s
mov s,eax
end;
writeln(s);
end;
procedure swapb;
var i,tmp:cardinal;
begin
i:=0;
for tmp:=1 to 100000000 do i:=i+1;
writeln(i);
end;
var s,a,m,n:cardinal;

begin
s:=gettickcount;
swapa ;
a:=gettickcount-s;
writeln(a);
m:=gettickcount;
swapb ;
n:=gettickcount-m;
writeln(n);
{ TODO -oUser -cConsole Main : Insert code here }
end.
运行结果swapa:952
swapb:320
我的机器是赛杨633。
 
你自己在两个过程中设定断点,用Ctrl+Alt+C看看Delphi生成的汇编代码吧:asm的东西
Delphi不能动,但是对for循环的优化是Borland的杀手锏啊。swapb的汇编代码:

xor ebx,ebx ;
i:=0;
mov eax,$05f5e100 ;
for tmp:=1 to 100000000 do
inc ebx ;
i:=i+1
dec eax ;
for tmp:=1 to 100000000 do
jnz -$04

对于那些在循环内没有用到循环变量的for循环,Delphi都用递减(dec)+判零转移(jnz)。
 
你的汇编写得效率不够好(@s: add eax,1),inc eax好多了。
现在编译器的优化能力很强,如果自己不熟悉汇编还是别用吧
 
学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
后退
顶部