Vil*_*ray 1 c optimization performance x86 assembly
我正在运行x86处理器,但我相信我的问题非常普遍.我很好奇CMP + JE序列与单个MUL操作所消耗的时钟周期的理论差异.
在C伪代码中:
unsigned foo = 1; /* must be 0 or 1 */
unsigned num = 0;
/* Method 1: CMP + JE*/
if(foo == 1){
num = 5;
}
/* Method 2: MUL */
num = foo*5; /* num = 0 if foo = 0 */
Run Code Online (Sandbox Code Playgroud)
不要过分深入研究伪代码,它纯粹是为了阐明这两种方法背后的数学逻辑.
我实际比较的是以下两个指令序列:
方法1:CMP + JE
MOV EAX, 1 ; FOO = 1 here, but can be set to 0
MOV EBX, 0 ; NUM = 0
CMP EAX, 1 ; if(foo == 1)
JE SUCCESS ; enter branch
JMP FINISH ; end program
SUCCESS:
MOV EBX, 5 ; num = 5
FINISH:
Run Code Online (Sandbox Code Playgroud)
方法2:MUL
MOV EAX, 1 ; FOO = 1 here, but can be set to 0
MOV ECX, EAX ; save copy of FOO to ECX
MUL ECX, 5 ; result = foo*5
MOV EBX, ECX ; num = result = foo*5
Run Code Online (Sandbox Code Playgroud)
似乎单个MUL(总共4个指令)比a CMP + JE(总共6个指令)更有效,但是指令的时钟周期是相同的 - 即完成与任何其他指令相同的指令所需的时钟周期数?
如果消耗的实际时钟周期取决于机器,那么单个MUL通常比大多数处理器上的分支方法更快,因为它需要更少的总指令?
Oli*_*rth 11
现代CPU性能比仅计算每条指令的周期数要复杂得多.您需要考虑以下所有因素(至少):
所有这些都将受到周围代码的严重影响.
基本上,几乎不可能像这样执行微基准并获得有用的结果!
但是,如果我不得不猜测,我会说没有JE的代码通常会更有效,因为它消除了分支,这简化了分支预测行为.
| 归档时间: |
|
| 查看次数: |
1453 次 |
| 最近记录: |