【问题标题】:In what platform memmove and memcpy can have significant performance difference?memmove 和 memcpy 在什么平台上可以有显着的性能差异?
【发布时间】:2013-11-04 08:10:51
【问题描述】:

我了解memmovememcpy 的区别在于memmove 处理内存重叠情况。我检查了 libgcc 中的实现,并从 intel 网站获得了这篇文章 [memcpy performance]

在libgcc中,memmovememcpy类似,都是一个字节一个字节,所以优化后性能应该差不多。

有人对此进行了测量并得到了这篇文章memcopy, memmove, and Speed over Safety。即使我认为memmove 不会比memcpy 快,但至少在Intel 平台上应该没有太大区别。

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

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

【问题讨论】:

  • memcpymemmove 已经有很多问题(请参阅右侧的“相关”栏)。您确定您的问题尚未涵盖其中之一吗?
  • 评论者,请阅读整个问题。似乎他知道定义上有什么区别,但实际上似乎没有区别。问题是“在哪些平台上重要?”
  • @Oli Charlesworth,我不是在问 memmove 和 memcpy 的区别,我知道 memmove 可以处理重叠问题。问题是真的有任何平台 memcpy 比 memmove 更快吗?
  • 这个问题不是与所列问题的重复!
  • @BoBTFish Reading 将问题标记为重复之前的问题不是这样的方式。您正在妨碍 Progress(tm)。 </sarcasm>

标签: c++ c performance


【解决方案1】:

良好做法:通常,仅在必要时才使用 memmove。当源区域和目标区域重叠的可能性非常合理时使用它。

否则使用 memcpy。 memcpy 更高效。

参考: https://www.youtube.com/watch?v=Yr1YnOVG-4g Dr. Jerry Cain,(Stanford Intro Systems Lecture - 7)时间:36:00

【讨论】:

    【解决方案2】:

    最近至少有一个案例使用非重叠内存的约束来生成更快的代码:

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

    另见Make compiler copy characters using movsd

    GCC also listsmemcpy 作为内置实现,其实现和动机可能与 Visual Studio 相似。

    【讨论】:

    • 但是为什么 movsd/movsw/movsb 不适合重叠复制?如果所有参数都知道,编译器也可以选择 movsd 或 movsw
    • 好的,我明白了。大多数时候只有块大小是编译时间常数。
    • movsX 指令总是向一个方向移动,从最低地址开始,并在复制过程中递增 edi/esi。 D/W/B 只选择复制单位(DWORD、WORD、BYTE)。
    • movsb 和朋友们可以反方向复制。它们由方向标志控制。没有理由 memove 不能像 memcpy 一样快。虽然不是每个实现都这样做,但这是肯定的。
    猜你喜欢
    • 2010-11-15
    • 2013-08-13
    • 2012-09-22
    • 2022-01-15
    • 1970-01-01
    • 2017-12-11
    • 2015-04-21
    • 2020-11-29
    相关资源
    最近更新 更多