为什么memcpy()更快?
我很好奇为什么memcpy函数比简单的手动拷贝快 这是我的密码:为什么memcpy()更快?,c,memcpy,C,Memcpy,我很好奇为什么memcpy函数比简单的手动拷贝快 这是我的密码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> int main() { clock_t begin, end; double time_spent; int i, j; char source[65536], destination[
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main()
{
clock_t begin, end;
double time_spent;
int i, j;
char source[65536], destination[65536];
begin = clock();
for (j = 0; j<1000; j++)
for (i = 0; i < 65536; i++) destination[i] = source[i];
//slower than memcpy(destination, source, 65536);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("%Lf\n",time_spent);
system("pause");
}
memcpy的实现不是做了同样的事情吗?
提前感谢。memcpy可以结合其他各种优化,例如SIMD。有关详细信息,请参阅。,因为for循环会逐个复制该项。而memcpy可以逐块复制项目。您可以在这里阅读memcpy的源代码:或者在这里一个好的优化编译器应该确定您的循环实际上是memmove或memcpy,并用对该函数的调用来替换它。这仍然留下了一个问题:为什么这样做是明智的 事实证明,有很大的空间可以手动优化编译后的代码以复制内存,而且编译器几乎没有足够的智能来完成这一切,但它也非常特定于cpu,因此OSs将为它们支持的每个cpu系列提供专门的版本,并在运行时交换它们 以下是OSX的x86_64 SSE 4.2拷贝实现: memcpy的实现不是做同样的事情吗 不一定 这是一个标准库函数,因此: 它可能是高度优化的,使用特定于平台的快速汇编指令,或者每次迭代只复制一个以上的字节,如果处理器有足够大的寄存器,这会更快; 编译器可能会将其识别为一个内置项,因此它可能会执行更多的优化步骤,例如,将其内联以消除函数调用开销,或者从其上下文中推断您正试图执行的操作,并使用另一种方法执行,等等。 memcpy不是一个普通的循环。有许多优化措施
对齐和单词大小等功能允许memcpy以稳定的速度复制更大的内存块。memcpy将尝试立即复制单词,也就是说,在32位系统上每次迭代4字节,在64位系统上每次迭代8字节。您只需进入memcpy,就可以发现它不是一个简单的循环。编译时使用了哪些优化标志?