求模运算和比较运算,哪一个需要更多的 CPU
时钟?
这段代码会花费更多的时间吗:
for(j = i; j <= 10; j++)
{
if(j == 10) printf("0");
else printf("%d", j);
}
或者这个
for(j = i; j <= 10; j++)
printf("%d", j % 10);
为什么?
求模运算和比较运算,哪一个需要更多的 CPU
时钟?
这段代码会花费更多的时间吗:
for(j = i; j <= 10; j++)
{
if(j == 10) printf("0");
else printf("%d", j);
}
或者这个
for(j = i; j <= 10; j++)
printf("%d", j % 10);
如果以CPU周期计算,取模运算可能需要更多的周期;这可能取决于CPU。然而,使用现代处理器来衡量性能不是很好的方法,因为这些处理器可以同时运行多个指令(流水线),拥有多层缓存等。在这种情况下,添加一个额外的测试将意味着增加一个分支,这可能在时间上更重要(即影响指令流水线)。唯一确定的方法是进行优化编译并计时。
我知道你的例子只是一个例子,但这也说明了“过早优化”的问题。调用printf
的时间比取模或比较操作长得多。如果你想优化你的例子,你可以写成:
printf ("1234567890");
在汇编语言中,取模操作意味着一种“从未如此简单”的乘法。可以参考一些算法。 分支操作实际上是第二快的指令(跳转是第一),因为只需要最多一个减法来进行比较。
gcc -S
)并检查代码,还可以使用优化标志。 - Grijesh Chauhan