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

哪个操作需要更多的CPU时钟,模或比较?,c,division,modulo,cpu-cycles,C,Division,Modulo,Cpu Cycles,哪个操作需要更多的CPU时钟、模运算或比较 此代码是否需要更多时间: for(j = i; j <= 10; j++) { if(j == 10) printf("0"); else printf("%d", j); } for(j=i;j比较是一种简单的操作,通常速度更快(CPU可以在位上使用逻辑运算符) 如果对不是二次幂的数字执行模运算,CPU必须执行除法运算,这可能是一个非常昂贵的操作(当然,这取决于所使用的数字的大小) 说到cpu时钟,比较可以并行进行,因为您可以只使

哪个操作需要更多的
CPU
时钟、
模运算
比较

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

for(j = i; j <= 10; j++)
{
   if(j == 10) printf("0");
   else printf("%d", j);
}

for(j=i;j比较是一种简单的操作,通常速度更快(CPU可以在位上使用逻辑运算符)

如果对不是二次幂的数字执行模运算,CPU必须执行除法运算,这可能是一个非常昂贵的操作(当然,这取决于所使用的数字的大小)


说到cpu时钟,比较可以并行进行,因为您可以只使用一个
xor
操作,因此执行
x==10
x==200000
将占用相同的少量cpu时钟。如果使用除法,这是不可能的,更大的数字将需要更多的时间。

如果以cpu周期为单位进行测量,则可能是modulo操作需要更多的周期;这可能取决于CPU。然而,对于同时运行多条指令(流水线)的现代处理器来说,CPU周期并不是衡量性能的好方法,具有多层缓存等。在这种情况下,进行额外测试将意味着进行额外的分支,这可能在计时方面更为重要(即影响指令管道)。唯一确定的方法是对其进行优化编译,并对其计时

我知道你的例子就是这样的,一个例子,但这也说明了过早的优化。调用
printf
所花费的时间比模或比较要多几个数量级。如果你想优化你的例子,你可以编写如下内容:

printf ("1234567890");

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

如果要比较汇编代码,可以反汇编可执行文件(或使用
gcc-S
)并检查代码,也可以使用优化标记,因为printf()实际上是一样的将吃掉99%的时间。如果你把它清理干净,@Javier的答案是正确的。还有一个除法:-)在许多处理器上,比较将结果写入全局寄存器,这会阻止它们与使用该寄存器的其他指令并行执行。有些处理器进行分区注册或为其提供“重命名”,这允许一些并行性。然而,即使这样,比较方法也需要一个分支,分支不仅不能并行,而且还可以中断指令预取和推测执行。除法比加法、减法、乘法和比较法要复杂得多,如果我理解的话,它需要一个以上的周期。我认为模可能是芯片中的除法。如果你可以用减法和乘法来代替,那么就这样做。此处的CPU周期:
printf ("1234567890");