【问题标题】:which operation takes more CPU clocks, modulo or comparison?哪个操作需要更多的 CPU 时钟,取模还是比较?
【发布时间】:2014-02-27 02:27:56
【问题描述】:

哪个操作需要更多 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);

为什么?

【问题讨论】:

  • 如果你想比较汇编代码,你可以反汇编可执行文件(或使用gcc -S)并检查代码,也可以使用优化标志
  • 几乎相同,因为 printf() 99% 的时间都会吃掉。如果你把它清理干净,@Javier 的答案是正确的。

标签: c division modulo cpu-cycles


【解决方案1】:

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

我知道你的例子只是一个例子,但这也说明了过早的优化。对printf 的调用将花费比模数或比较多几个数量级的时间。如果你想优化你的例子,你会写这样的:

printf ("1234567890");

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 在许多处理器上,比较会将其结果写入全局寄存器,这会阻止它们与使用该寄存器的其他指令并行执行。一些处理器对寄存器进行分区或为其提供“重命名”,这允许一些并行性。但是,即使这样,比较方法也需要分支,并且分支不仅不能并行化,而且会中断指令预取和推测执行。
    • 除法比加、减、乘要复杂得多,相比之下,如果我理解的话,它需要一个以上的周期。我认为模数可能是在芯片中构建的。如果你可以用减法和乘法代替,那就这样做。这里的 CPU 周期:embeddedgurus.com/stack-overflow/2011/02/…
    【解决方案3】:

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

    【讨论】:

    • 还有一个部门 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2011-09-23
    • 2016-07-07
    相关资源
    最近更新 更多