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);
    }   
}

操作系统是linux-2.6.35,编译器是GCC-4.4.5,选项为"-std=c99 -O3"。

我电脑上的结果(memcpy 4KB,迭代100万次):

时间 ./测试.测试 1 4

real    0m0.128s
user    0m0.120s
sys 0m0.000s

时间 ./测试.测试 0 4

real    0m0.422s
user    0m0.420s
sys 0m0.000s

这个问题与上一个问题有关:

为什么 memcpy() 的速度每 4KB 就会急剧下降?

更新

原因与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

海湾合作委员会似乎越来越聪明了。

malloc 返回的特定地址由实现选择,并不总是最适合使用代码。您已经知道,移动内存的速度在很大程度上取决于缓存和页面效果。

在这里,错误定位的具体指针是未知的。您可以使用printf("%p", ptr)打印它们。然而,已知的是,仅对两个块使用一个malloc肯定会避免两个块之间的页面和缓存浪费。这可能已经是速度差异的原因。

相关内容

  • 没有找到相关文章

最新更新