设置单个存储器单元到零或在x86汇编恒定最快方式是什么?

问题描述 投票:2回答:2

什么是设置一个单一的存储单元中的x86零最快的方法是什么?通常我做的方式是这样的:

C745D800000000  MOV [ebp-28], 0

正如你可以看到这个有着相当厚实的编码,因为它是使用全部4个字节的常数。如果是单纯的注册,我可以使用MVZE这是更紧凑,但MVZE不带记忆工作。

我想也许清楚寄存器,然后MOV寄存器的值到内存中。然后,这将是两个指令,但只有5字节总计:一个7字节指令,而不是上面。继规则“如果其短,它通常更快”,这可能是可取的。

assembly x86 x86-64 zero micro-optimization
2个回答
5
投票

不幸的是,你在这里写的是“直接”零出一个存储单元的唯一途径。当然,XOR运算出一个寄存器,然后将其移动到一些内存的位置也将工作,但我不知道这是否会是任何更快。

如果你碰巧有一个寄存器的值是零,你肯定它,然后通过各种手段使用它。否则,只用mov [ebp-28], 0。请记住,mem, imm操作数被称为是最慢的一个:如果你分析代码,并发现这是一个瓶颈,试着在你的函数(或其他)的开头初始化寄存器到零,然后在整个使用它的代码,作为一种预定的恒定的。


2
投票

如果你希望你的数据是从缓存中,并且你不要指望能很快再次访问它,MASKMOVDQU可能是最快的方式。这允许你写一个或多个字节,而不影响周围的字节,而无需等待请求的所有权要求携带相关的缓存线到内存中。

从本质上讲,写入直接到内存发送,而不是周围的其他方式。由于CPU与高速缓存行大小的块存储交互,是什么在幕后发生的事情是包含写入高速缓存行是发下来,以表明该字节实际上是更新的面具一起。无论是在存储器控制器,L3高速缓存或存储器本身,要被写入的字节则与该应单独字节合并。

© www.soinside.com 2019 - 2024. All rights reserved.