在什么平台上memmove和memcpy可以有显著的性能差异
In what platform memmove and memcpy can have significant performance difference?
我知道memmove
和memcpy
区别在于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
- 正在查找文档以获得PS4平台的C++中的设备信息
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 在容量内调整矢量大小时的性能影响
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 了解算法的性能差异(如果以不同的编程语言实现)
- 未达到的情况会影响开关外壳性能
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 哪种方法更好,性能明智
- C++ 特征库:引用的性能开销<>
- 随机数生成器的性能因平台而异
- iMX6上的Qt5:在平台eglfs上运行的性能优势与xcb相比