memcpy()的速度极大地受到malloc()的不同方式的影响
我编写了一个程序来测试memcpy()
的速度。 但是,如何分配内存会极大地影响速度。
码
#include<stdlib.h>
#include<stdio.h>
#include<sys/time.h>
void main(int argc, char *argv[]){
unsigned char * pbuff_1;
unsigned char * pbuff_2;
unsigned long iters = 1000*1000;
int type = atoi(argv[1]);
int buff_size = atoi(argv[2])*1024;
if(type == 1){
pbuff_1 = (void *)malloc(2*buff_size);
pbuff_2 = pbuff_1+buff_size;
}else{
pbuff_1 = (void *)malloc(buff_size);
pbuff_2 = (void *)malloc(buff_size);
}
for(int i = 0; i < iters; ++i){
memcpy(pbuff_2, pbuff_1, buff_size);
}
if(type == 1){
free(pbuff_1);
}else{
free(pbuff_1);
free(pbuff_2);
}
}
OS是linux-2.6.35,编译器是GCC-4.4.5,选项“-std = c99 -O3”。
结果在我的电脑上( memcpy
4KB,迭代100万次):
时间./test.test 1 4
real 0m0.128s
user 0m0.120s
sys 0m0.000s
时间./test.test 0 4
real 0m0.422s
user 0m0.420s
sys 0m0.000s
这个问题与前面的问题有关:
为什么memcpy()的速度每4KB急剧下降?
UPDATE
原因与GCC编译器有关,我编译并运行了不同版本的GCC的这个程序:
GCC版本-------- 4.1.3
-------- 4.4.5
-------- 4.6.3
使用时间(1)----- 0m0.183s
---- 0m0.128s
---- 0m0.110s
使用时间(0)----- 0m1.788s
---- 0m0.422s
---- 0m0.108s
看来GCC变得更聪明了。
malloc返回的特定地址由实现选择,并不总是使用代码的最佳选择。 你已经知道移动内存的速度很大程度上取决于缓存和页面效果。
这里,malloced的特定指针是未知的。 你可以使用printf("%p", ptr)
将它们打印出来。 然而,众所周知的是,只使用一个malloc来处理两个块肯定可以避免两个块之间的页面和缓存浪费。 这可能已经是速度差异的原因。
上一篇: Speed of memcpy() greatly influenced by different ways of malloc()