【发布时间】:2016-01-14 03:47:04
【问题描述】:
假设我们想在 EDI 中存储一个字符串。这样存储会不会更快
mov byte [edi],0
mov byte [edi+1],1
mov byte [edi+2],2
mov byte [edi+3],3
...
还是这样?
mov byte [edi],0
inc edi
mov byte [edi],1
inc edi
mov byte [edi],2
inc edi
mov byte [edi],3
inc edi
...
有些人可能会在 little-endian 中提出以下建议:
mov dword [edi],0x3210
或以下大端:
mov dword [edi],0x0123
但这不是我的问题的重点。我的问题是,增加指针然后执行 mov 从而需要更多指令是否更快,或者在每个 mov 指令中指定添加到 EDI 指向的偏移地址的数量是否更快?如果后者是正确的,那么在将多少个具有相同编号的 mov 指令添加到偏移地址之后,是否值得将那个数量添加到指针中?也就是说,这是
mov byte [edi+5],0xFF
mov byte [edi+5],0xFF
mov byte [edi+5],0xFF
mov byte [edi+5],0xFF
比这还快?
add edi,5
mov byte [edi],0xFF
mov byte [edi],0xFF
mov byte [edi],0xFF
mov byte [edi],0xFF
【问题讨论】:
-
在不了解处理器品牌、架构等的情况下,这是一个毫无意义的问题。通常情况下,数据路径宽度的一次移动将比相同数据的字节移动更快。但即使这样也不是小菜一碟,因为现代架构优化了这种情况。
-
请注意:它将是 0x00010203 而不是 0x0123。
-
带有偏移量的指令经过高度优化,不会使流水线停滞,所以我想说它们会更快。但无论如何,您可能会受到内存速度的限制,即使您正在写入缓存。
-
@MarkRansom:如果存储序列的长度有限,那么它所占用的其他执行资源的数量决定了它与周围指令的混合程度。