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