比较运算符在编程中如何利用CPU循环
How comparison operator utilizes CPU cycle in programming
如果我有以下条件,那么哪个比较条件执行得快(根据 CPU 周期和时间):
if(1 < 2)
if(1 < 100)
您的示例中没有动态值,只有常量,因此编译器(AOT 或 JIT 编译器)可以优化这两个条件,编译后的代码将不包含 if
。因此这些条件之间没有区别。
即使有动态值,两种情况下的速度也是一样的。因为与一个值的比较是快速操作,所以与 2 或 1000 的比较将具有相同的时间。
例如对于 x86 64 位。 if (value < 2)
会翻译成类似:
cmp rax, 2
jl condition_succeded_label
来自 Torbjörn Granlund 的 Instruction latencies and throughput for AMD and Intel x86 processors,Intel/AMD CPU 对 CMP
指令(下面的 L64)有 1 个周期延迟,而现代 Intel/AMD CPUs 最多可以并行执行 4 CMP
条指令(T64,下面的吞吐量)。无论常量操作数是 2 还是 1000。
可能不同的是分支预测错误,当 CPU 预测错误分支时,可能需要 CPU 或更多的 10-20 个周期(reference from Wikipedia)或更多(取决于 CPU 模型、缓存中的数据、内存速度)。虽然比较本身需要 0.25-1 个周期,如上面的 table。
如果我有以下条件,那么哪个比较条件执行得快(根据 CPU 周期和时间):
if(1 < 2)
if(1 < 100)
您的示例中没有动态值,只有常量,因此编译器(AOT 或 JIT 编译器)可以优化这两个条件,编译后的代码将不包含 if
。因此这些条件之间没有区别。
即使有动态值,两种情况下的速度也是一样的。因为与一个值的比较是快速操作,所以与 2 或 1000 的比较将具有相同的时间。
例如对于 x86 64 位。 if (value < 2)
会翻译成类似:
cmp rax, 2
jl condition_succeded_label
来自 Torbjörn Granlund 的 Instruction latencies and throughput for AMD and Intel x86 processors,Intel/AMD CPU 对 CMP
指令(下面的 L64)有 1 个周期延迟,而现代 Intel/AMD CPUs 最多可以并行执行 4 CMP
条指令(T64,下面的吞吐量)。无论常量操作数是 2 还是 1000。
可能不同的是分支预测错误,当 CPU 预测错误分支时,可能需要 CPU 或更多的 10-20 个周期(reference from Wikipedia)或更多(取决于 CPU 模型、缓存中的数据、内存速度)。虽然比较本身需要 0.25-1 个周期,如上面的 table。