当前位置:  开发笔记 > 编程语言 > 正文

编译成更快的代码:"n*3"或"n +(n*2)"?

如何解决《编译成更快的代码:"n*3"或"n+(n*2)"?》经验,为你挑选了3个好方法。

编译成更快的代码:"ans = n*3"或"ans = n +(n*2)"?

假设n是int或long,它是在现代Win32 Intel盒子上运行的.

如果涉及一些解除引用,这会有所不同,也就是说,哪些更快?


long    a;
long    *pn;
long     ans;

...
*pn = some_number;
ans = *pn * 3;

要么

ans = *pn+(*pn*2);

或者,它是否需要不用担心,因为优化编译器在任何情况下都可能解释这一点?



1> aku..:

IMO这样的微优化是没有必要的,除非你使用一些奇特的编译器.我会把可读性放在第一位.



2> Ferruccio..:

没关系.现代处理器可以在一个时钟周期或更短的时间内执行整数MUL指令,这与需要执行一系列移位并在内部添加以执行MUL的旧处理器不同,从而使用多个周期.我敢打赌

MUL EAX,3

执行速度快于

MOV EBX,EAX
SHL EAX,1
ADD EAX,EBX

这种优化可能有用的最后一个处理器可能是486.(是的,这偏向于英特尔处理器,但也可能代表其他架构).

无论如何,任何合理的编译器都应该能够生成最小/最快的代码.因此,首先要考虑可读性.


我真的怀疑MUL执行得更快,一旦考虑到你可以使用的寄存器的延迟和不灵活性.此外,在x86上,LEA,而不是你给出的3指令序列,任何体面的编译器都会使用3*n和n + 2*n.

3> Antti Kissan..:

由于自己很容易测量,为什么不这样做呢?(使用gcctime来自cygwin)

/* test1.c */
int main()
{
    int result = 0;
    int times = 1000000000;
    while (--times)
        result = result * 3;
    return result;
}

machine:~$ gcc -O2 test1.c -o test1
machine:~$ time ./test1.exe

real    0m0.673s
user    0m0.608s
sys     0m0.000s

进行几次测试,然后重复另一种情况.

如果你想查看汇编代码, gcc -S -O2 test1.c

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有