首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ESI比EAX慢?

使用ESI比EAX慢?
EN

Stack Overflow用户
提问于 2010-12-14 10:06:12
回答 4查看 746关注 0票数 2

这段asm比使用eax寄存器的对应部分慢得多。为什么会这样呢?

代码语言:javascript
复制
jmp .l2
.l1:

   dec ESI
.l2:
   cmp ESI, 0
   jne .l1

代码语言:javascript
复制
jmp .l2
.l1:

   dec EAX
.l2:
   cmp EAX, 0
   jne .l1
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-14 10:08:29

性能将取决于使用EAX和ESI是为了什么,在这段代码运行之前和之后。根据不同的体系结构,CPU可以并行处理操作在不同寄存器上的指令;运行在同一寄存器上的代码必须阻塞。

(除了信任编译器之外,我没有其他更具体的建议:它知道分配寄存器以利用并行性的正确方法,而我不知道。)

票数 5
EN

Stack Overflow用户

发布于 2010-12-14 10:39:31

,Boath代码段或多或少有一些额外的速度。您可以通过执行指令rdtsc来检查执行速度,在规则执行之前和之后测量(计数)执行CPU时钟。当然,boath rutines必须从EAX和ESI寄存器中的一些值开始。不要使用庞大的循环值,因为任务调度程序会在循环执行过程中中断当前任务,这样就会得到错误的结果。但是,如果某些累赘的结果偏离了任务调度程序所中断的当前任务,那么您必须忽略该结果。

编辑:测试

我把这两种测试都放在这里,这样每个人都可以检查结果:

代码语言:javascript
复制
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执行产生任何区别。

票数 1
EN

Stack Overflow用户

发布于 2010-12-14 14:25:00

在某些情况下,使用AX/EAX的指令可能更短。在8088天(由于8位数据总线和缓慢的内存访问)的时候,处理器浪费了大量的时间来填充管道来运行下一条指令,这并不是什么大事。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4437966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档