哪个操作需要更多CPU
个时钟,modulo
或comparison
?
此代码是否需要更多时间:
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);
为什么?
答案 0 :(得分:10)
如果在CPU周期中测量,模数运算可能需要更多周期;这可能取决于CPU。但是,CPU周期不是衡量性能的好方法,现代处理器一次运行多个指令(流水线),有多层缓存等。在这种情况下,进行额外测试将意味着额外的分支,这在时序方面可能更重要(即影响指令流水线)。确切知道的唯一方法是对其进行优化编译,并将其计时。
我知道你的例子只是一个例子,但这也说明了过早优化。对printf
的调用将比模数或比较多花费数量级。如果您想优化您的示例,您可以编写如下内容:
printf ("1234567890");
答案 1 :(得分:3)
比较是一个简单的操作,通常更快(CPU可以在位上使用逻辑运算符)。
如果对不是2的幂的数字执行模数,则CPU必须执行除法,这可能是非常昂贵的操作(当然,这取决于您使用的数字的大小)。
说到cpu时钟,可以并行进行比较,因为你可以只使用xor
操作,所以做x==10
或x==200000
会占用相同的少量cpu时钟。通过划分这是不可能的,更大的数字将需要更多的时间。
答案 2 :(得分:3)
就汇编而言,模运算意味着“从未如此简单”的乘法。查看一些algorithms。 分支操作实际上是第二快的指令(跳转是第一个),因为它只需要最多一个减法进行比较。