许多处理器具有“小”指令,可以对某些立即指定的操作数执行算术运算,包括比较。这些特殊值以外的操作数必须使用更大的指令格式,或者在某些情况下,必须使用“从内存中加载值”指令。例如,在ARM Cortex-M3指令集中,至少有五种方法可以将值与常数进行比较:
cmp r0,#1 ; One-word instruction, limited to values 0-255
cmp r0,#1000 ; Two-word instruction, limited to values 0-255 times a power of 2
cmn r0,#1000 ; Equivalent to comparing value with -1000
; Two-word instruction, limited to values 0-255 times a power of 2
mov r1,#30000 ; Two words; can handle any value 0-65535
cmp r0,r1 ; Could use cmn to compare to values -1 to -65535
ldr r1,[constant1000000] ; One or two words, based upon how nearby the constant is
cmp r0,r1
...
constant1000000:
dd 1000000
第一种形式是最小的。第二种形式和第三种形式执行的速度可能快也可能不会快,这取决于从中获取代码的内存的速度。第四种形式几乎肯定会比前三种形式慢,而第五种形式甚至更慢,但后者可以与任何32位值一起使用。
在较早的x86处理器上,短格式比较指令的执行速度比长格式比较指令的执行速度快,但是许多较新的处理器会在首次获取长格式和短格式时将其转换为相同的表示形式,并将该统一表示形式存储在缓存中。因此,尽管嵌入式控制器(如在许多移动平台上发现的控制器)会有速度差异,但许多基于x86的计算机却没有。
还要注意,在许多情况下,在循环中大量使用常量的情况下,编译器只需要在循环开始之前一次将常量加载到寄存器中,就可以解决时序差异。另一方面,在某些情况下,即使是小循环,也不会总是发生。如果循环很小但执行力很强,则涉及短立即值的比较和涉及较长立即值的比较之间有时可能会表现出较大的性能。