memcpy 什么时候比简单的重复分配更快?
When is memcpy faster than simple repeated assignment?
假设要复制声明为
的数组
DATA_TYPE src[N];
无论 DATA_TYPE
和数组的元素数量是多少,memcpy
是否总是与以下代码片段一样快或更快?
DATA_TYPE dest[N];
for (int i=0; i<N; i++)
dest[i] = src[i];
对于像 char
这样的小类型和 N
这样的大类型,我们可以确定 memcpy
更快(除非编译器将循环替换为对 memcpy
的调用).但是如果类型比较大,比如double
,and/or数组元素个数少呢?
复制许多 double
数组时,我想到了这个问题,每个数组包含 3 个元素。
我在wohlstad在评论中提到的另一个问题的答案中没有找到我的问题的答案。该问题中公认的答案基本上是说“留给编译器来决定”。这不是我要找的那种答案。编译器可以通过选择一种替代方案来优化内存复制这一事实并不是一个答案。为什么以及什么时候一种选择更快?也许编译器知道答案,但是包括编译器开发人员在内的开发人员不知道!
由于 memcpy
是一个库函数,它完全取决于库的实现,它的实际效率如何,没有明确的答案是可能的。
也就是说,任何提供的标准库都可能经过高度优化,甚至可能使用 DMA 传输等硬件特定功能。虽然您的代码循环性能会因优化设置而异,因此在未优化的调试版本中可能会表现更差。
另一个考虑因素是 memcpy()
的性能将独立于数据类型并且通常 确定性 ,而您的循环性能可能会因 [=12] 而异=],甚至 N
.
的值
一般来说,我希望 memcpy()
是最佳的,更快或与赋值循环一样快,并且肯定更一致和确定性,独立于特定的编译器设置,甚至独立于所使用的编译器。
最后,唯一的判断方法是针对您的特定平台、工具链、库和构建选项以及各种数据类型进行衡量。最终,由于您必须针对每种使用组合对其进行测量,以 知道 是否更快,我建议这通常是在浪费时间,并且仅出于学术兴趣 - 使用图书馆 -不仅是为了性能和一致性,也是为了清晰度和可维护性。
假设要复制声明为
的数组DATA_TYPE src[N];
无论 DATA_TYPE
和数组的元素数量是多少,memcpy
是否总是与以下代码片段一样快或更快?
DATA_TYPE dest[N];
for (int i=0; i<N; i++)
dest[i] = src[i];
对于像 char
这样的小类型和 N
这样的大类型,我们可以确定 memcpy
更快(除非编译器将循环替换为对 memcpy
的调用).但是如果类型比较大,比如double
,and/or数组元素个数少呢?
复制许多 double
数组时,我想到了这个问题,每个数组包含 3 个元素。
我在wohlstad在评论中提到的另一个问题的答案中没有找到我的问题的答案。该问题中公认的答案基本上是说“留给编译器来决定”。这不是我要找的那种答案。编译器可以通过选择一种替代方案来优化内存复制这一事实并不是一个答案。为什么以及什么时候一种选择更快?也许编译器知道答案,但是包括编译器开发人员在内的开发人员不知道!
由于 memcpy
是一个库函数,它完全取决于库的实现,它的实际效率如何,没有明确的答案是可能的。
也就是说,任何提供的标准库都可能经过高度优化,甚至可能使用 DMA 传输等硬件特定功能。虽然您的代码循环性能会因优化设置而异,因此在未优化的调试版本中可能会表现更差。
另一个考虑因素是 memcpy()
的性能将独立于数据类型并且通常 确定性 ,而您的循环性能可能会因 [=12] 而异=],甚至 N
.
一般来说,我希望 memcpy()
是最佳的,更快或与赋值循环一样快,并且肯定更一致和确定性,独立于特定的编译器设置,甚至独立于所使用的编译器。
最后,唯一的判断方法是针对您的特定平台、工具链、库和构建选项以及各种数据类型进行衡量。最终,由于您必须针对每种使用组合对其进行测量,以 知道 是否更快,我建议这通常是在浪费时间,并且仅出于学术兴趣 - 使用图书馆 -不仅是为了性能和一致性,也是为了清晰度和可维护性。