为什么奔腾汇编指令越多,花费的时间就越少? [英] Why do more Pentium assembly instructions take less time?
本文介绍了为什么奔腾汇编指令越多,花费的时间就越少?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我们在两台英特尔计算机上获得的结果非常不同。
CPUID指令告知Family、Model和Step。
机器1:家庭6,型号15步进11。CPUZ报告"Intel Core 2 Duo E6750"
这些指令的执行速度在统计上是相同的。
机器2:家庭15,型号3,第三步。CPUZ报告"Intel Pentium 4"
第一个序列比第二个序列花费的时间长约8%。
我们根本无法解释时间上的增加。不应该有任何不同的标志延迟、分支预测、寄存器使用问题等。至少我们无法判断。
有人知道为什么在一台计算机上执行第一个序列需要更长的时间吗?
编辑:在第一个序列中添加"XOR PTR Ereg,0"确实会使计时与奔腾4上的第二个匹配。奇怪。
第一个序列:
00000040 ALUSHIFT_AND_C_V_E LABEL NEAR
00000040 0F B7 04 55 MOVZX EAX, gwr[(SIZEOF WORD) * EDX] ; EAX = 0000000000000000 LLLLLLLLLLLLLLLL
00000000 E
00000048 0F B7 14 4D MOVZX EDX, gwr[(SIZEOF WORD) * ECX] ; EDX = 0000000000000000 RRRRRRRRRRRRRRRR
00000000 E
00000050 23 C2 AND EAX, EDX ; AX = L&R (result)
00000052 A3 00000000 E MOV dvalue, EAX ; Save the temporary ALU/Shifter result
00000057 C3 RET ; Return
第二个序列:
00000060 ALUSHIFT_AND_C_V_NE LABEL NEAR
00000060 0F B7 04 55 MOVZX EAX, gwr[(SIZEOF WORD) * EDX] ; EAX = 0000000000000000 LLLLLLLLLLLLLLLL
00000000 E
00000068 0F B7 14 4D MOVZX EDX, gwr[(SIZEOF WORD) * ECX] ; EDX = 0000000000000000 RRRRRRRRRRRRRRRR
00000000 E
00000070 23 C2 AND EAX, EDX ; AX = L&R (result)
00000072 80 35 00000000 E XOR BYTE PTR ereg, 1 ; E = ~E
01
00000079 A3 00000000 E MOV dvalue, EAX ; Save the temporary ALU/Shifter result
0000007E C3 RET ; Return
推荐答案
在奔腾I或奔腾II之后,编译器执行的大多数优化都不是作为所必需的。芯片会将这些指令分解成微操作,然后为您进行优化。这可能是芯片之间的分支预测差异,或者是XOR+RET与普通RET一样昂贵的事实。我不太熟悉你上面所说的奔腾的型号。另一种可能性是也可能是缓存线问题或硬件差异。
英特尔文档中可能有某些内容,也可能没有。
不管怎样。有经验的汇编程序员知道,唯一的真理是通过测试来实现的,这就是您正在做的事情。
这篇关于为什么奔腾汇编指令越多,花费的时间就越少?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文