这段asm比使用eax寄存器的对应部分慢得多。为什么会这样呢?
jmp .l2
.l1:
dec ESI
.l2:
cmp ESI, 0
jne .l1jmp .l2
.l1:
dec EAX
.l2:
cmp EAX, 0
jne .l1发布于 2010-12-14 10:08:29
性能将取决于使用EAX和ESI是为了什么,在这段代码运行之前和之后。根据不同的体系结构,CPU可以并行处理操作在不同寄存器上的指令;运行在同一寄存器上的代码必须阻塞。
(除了信任编译器之外,我没有其他更具体的建议:它知道分配寄存器以利用并行性的正确方法,而我不知道。)
发布于 2010-12-14 10:39:31
,Boath代码段或多或少有一些额外的速度。您可以通过执行指令rdtsc来检查执行速度,在规则执行之前和之后测量(计数)执行CPU时钟。当然,boath rutines必须从EAX和ESI寄存器中的一些值开始。不要使用庞大的循环值,因为任务调度程序会在循环执行过程中中断当前任务,这样就会得到错误的结果。但是,如果某些累赘的结果偏离了任务调度程序所中断的当前任务,那么您必须忽略该结果。
编辑:测试
我把这两种测试都放在这里,这样每个人都可以检查结果:
var
StartTicks :Int64;
EndTicks :Int64;
procedure TForm9.ButtonEAXClick(Sender: TObject);
begin
asm
rdtsc
mov dword ptr [StartTicks], eax
mov dword ptr [StartTicks + 4], edx
//Start test
mov eax, 10000
@Loop:
dec eax
cmp eax, 0
jnz @Loop
//End test
rdtsc
mov dword ptr [EndTicks], eax
mov dword ptr [EndTicks + 4], edx
end;
caption := IntToStr(EndTicks - StartTicks);
end;
procedure TForm9.ButtonESIClick(Sender: TObject);
begin
asm
rdtsc
mov dword ptr [StartTicks], eax
mov dword ptr [StartTicks + 4], edx
//Start test
mov esi, 10000
@Loop:
dec esi
cmp esi, 0
jnz @Loop
//End test
rdtsc
mov dword ptr [EndTicks], eax
mov dword ptr [EndTicks + 4], edx
end;
caption := IntToStr(EndTicks - StartTicks);
end;现代CPU上的10000循环不会对使用EAX或ESI.的rutine执行产生任何区别。
发布于 2010-12-14 14:25:00
在某些情况下,使用AX/EAX的指令可能更短。在8088天(由于8位数据总线和缓慢的内存访问)的时候,处理器浪费了大量的时间来填充管道来运行下一条指令,这并不是什么大事。
https://stackoverflow.com/questions/4437966
复制相似问题