在什么平台上memmove和memcpy可以有显著的性能差异

In what platform memmove and memcpy can have significant performance difference?

本文关键字:性能 平台 memmove memcpy 在什么      更新时间:2023-10-16

我知道memmovememcpy区别在于memmove处理内存重叠的情况。我已经检查了libgcc中的实现,并从英特尔网站上获得了这篇文章[memcpy性能]。

在libgcc中,memmove类似于memcpy,两者都只是经过一个字节和字节,所以即使经过优化,性能也应该几乎相同。

有人测量了这一点,并得到了这篇文章memcopy,memmove和Speed over Safety。即使我不认为memmove可以比memcpy快,但至少在Intel平台上应该没有太大区别。

那么在什么平台和方式上,memcpy可以明显快于memmove,如果没有,为什么要提供两个类似的功能而不是仅仅memmove,并导致很多bug。

编辑:我不是在问memmove和memcpy的区别,我知道memmove可以处理重叠问题。问题是真的有没有一个平台的memcpy比memmove更快?

最近至少有一种情况,其中使用非重叠内存的约束来生成更快的代码:

在Visual Studio中,memcpy可以使用内部函数进行编译,而memmove则不能。这导致memcpy对于已知大小的小区域来说要快得多,因为消除了函数调用和设置开销。使用 movsd/movsw/movsb 的实现不适合重叠块,因为它从最低地址开始复制,在复制过程中增加 edi/esi。

另请参阅使用 movsd 使编译器复制字符。

GCC还将memcpy列为内置实现,实现和动机可能与Visual Studio相似。

良好做法:一般来说,只有在必要时才使用 memmove。当源区域和目标区域有非常合理的可能性重叠时,请使用它。

否则使用memcpy.memcpy更有效率。

参考:https://www.youtube.com/watch?v=Yr1YnOVG-4g Jerry Cain博士(斯坦福大学系统入门讲座 - 7) 时间:36:00