我知道xorq %rax,%rax
比movq $0,%rax
快,因为我的编译器告诉我。但是,如果我不知道答案,我应该怎么做才能比较 xorq 和 movq 表演?
我试过的是:
int main(void)
{
long a;
long i = 0;
for (i = 0; i < 10000000000l; i++) {
a = 10;
__asm__(
#if 0
"movq $0, %%rax"
#else
"xorq %%rax, %%rax"
#endif
: "=a" (a) : "a" (a))
}
return 0;
}
然而,当我计划程序时(一次使用#if 0
,一次使用#if 1
),我会得到非常相似的结果(5.876±0.001秒)。仅供参考,我已将缩放调控器设置为最低频率,并且已检查time(1)
返回的用户行。
我还尝试过使用addq %rax,%rax
vs imulq $2,%rax
,但没有运气。
我知道现代处理器在优化代码执行方面非常聪明,我想这就是为什么我没有得到有用的结果。所以我在这里问:我该怎么办?我在正确的道路上吗?
答案 0 :(得分:1)
你将不得不多次展开循环的内容,比如10或100.否则主要是你测量循环开销。另外我建议for (i = 1000...; --i>=0;)
可以编译成更少的指令。