晨曦微见 2015-05-28 08:58 采纳率: 100%
浏览 2715
已采纳

讨论下这两个函数fact1和fact2的效率

int fact1(int limit)
{
for (i=1;i<limit;i++) fact *= i;
}
int fact2(int limit)
{
for (i=limit; i!=0; i--) fact *= i;
}
这个是当时上学老师出的一道题,我也觉得应该效率一样,不知道各位有什么不同看法

根据10楼兄弟的回答,我用objdump的反汇编结果如下:

 00000000004004c2 <fact1>:
  4004c2:   55                      push   %rbp
  4004c3:   48 89 e5                mov    %rsp,%rbp
  4004c6:   89 7d ec                mov    %edi,-0x14(%rbp)
  4004c9:   c7 45 f8 00 00 00 00    movl   $0x0,-0x8(%rbp)
  4004d0:   c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)
  4004d7:   c7 45 f8 01 00 00 00    movl   $0x1,-0x8(%rbp)
  4004de:   eb 0e                   jmp    4004ee <fact1+0x2c>
  4004e0:   8b 45 fc                mov    -0x4(%rbp),%eax
  4004e3:   0f af 45 f8             imul   -0x8(%rbp),%eax
  4004e7:   89 45 fc                mov    %eax,-0x4(%rbp)
  4004ea:   83 45 f8 01             addl   $0x1,-0x8(%rbp)
  4004ee:   8b 45 f8                mov    -0x8(%rbp),%eax
  4004f1:   3b 45 ec                cmp    -0x14(%rbp),%eax
  4004f4:   7c ea                   jl     4004e0 <fact1+0x1e>
  4004f6:   5d                      pop    %rbp
  4004f7:   c3                      retq   

00000000004004f8 <fact2>:
  4004f8:   55                      push   %rbp
  4004f9:   48 89 e5                mov    %rsp,%rbp
  4004fc:   89 7d ec                mov    %edi,-0x14(%rbp)
  4004ff:   c7 45 f8 00 00 00 00    movl   $0x0,-0x8(%rbp)
  400506:   c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)
  40050d:   8b 45 ec                mov    -0x14(%rbp),%eax
  400510:   89 45 f8                mov    %eax,-0x8(%rbp)
  400513:   eb 0e                   jmp    400523 <fact2+0x2b>
  400515:   8b 45 fc                mov    -0x4(%rbp),%eax
  400518:   0f af 45 f8             imul   -0x8(%rbp),%eax
  40051c:   89 45 fc                mov    %eax,-0x4(%rbp)
  40051f:   83 6d f8 01             subl   $0x1,-0x8(%rbp)
  400523:   83 7d f8 00             cmpl   $0x0,-0x8(%rbp)
  400527:   75 ec                   jne    400515 <fact2+0x1d>
  400529:   8b 45 fc                mov    -0x4(%rbp),%eax
  40052c:   5d                      pop    %rbp
  40052d:   c3                      retq   

应该和你的觉过一样,减法可以直接判断,加法多了一个mov,但是我这边怎么这么繁琐,没你的简易

  • 写回答

13条回答 默认 最新

  • nswcfd 2015-05-29 10:47
    关注

    反汇编一下就知道区别了。

    循环条件的判断,一个是迭代量跟某个固定值的比较(cmp %eax, XXX),一个是迭代量是否为0的比较(test %eax, %eax)。
    cmp和test的效率有区别吗?

    -O3之后,就会发现,循环体是4条指令跟3条指令的区别。
    也就是说,可以直接利用减法的结果来进行判断调整,加法则不行,还需要额外的比较。

    .L4:
    imull %eax, %edx
    addl $1, %eax
    cmpl %edi, %eax
    jne .L4

    .L14:
    imull %eax, %edx
    subl $1, %eax
    jne .L14

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(12条)

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作