哪个操作需要更多CPU时钟,模数或比较?

时间:2014-02-03 14:38:33

标签: c division modulo cpu-cycles

哪个操作需要更多CPU个时钟,modulocomparison

此代码是否需要更多时间:

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);

为什么?

3 个答案:

答案 0 :(得分:10)

如果在CPU周期中测量,模数运算可能需要更多周期;这可能取决于CPU。但是,CPU周期不是衡量性能的好方法,现代处理器一次运行多个指令(流水线),有多层缓存等。在这种情况下,进行额外测试将意味着额外的分支,这在时序方面可能更重要(即影响指令流水线)。确切知道的唯一方法是对其进行优化编译,并将其计时。

我知道你的例子只是一个例子,但这也说明了过早优化。对printf的调用将比模数或比较多花费数量级。如果您想优化您的示例,您可以编写如下内容:

printf ("1234567890");

答案 1 :(得分:3)

比较是一个简单的操作,通常更快(CPU可以在位上使用逻辑运算符)。

如果对不是2的幂的数字执行模数,则CPU必须执行除法,这可能是非常昂贵的操作(当然,这取决于您使用的数字的大小)。

说到cpu时钟,可以并行进行比较,因为你可以只使用xor操作,所以做x==10x==200000会占用相同的少量cpu时钟。通过划分这是不可能的,更大的数字将需要更多的时间。

答案 2 :(得分:3)

就汇编而言,模运算意味着“从未如此简单”的乘法。查看一些algorithms。 分支操作实际上是第二快的指令(跳转是第一个),因为它只需要最多一个减法进行比较。