gpt4 book ai didi

performance - memcpy() 的速度受 malloc() 不同方式的影响很大

转载 作者:行者123 更新时间:2023-12-04 15:34:35 28 4
gpt4 key购买 nike

我写了一个程序来测试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万次):

时间 ./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

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

Why does the speed of memcpy() drop dramatically every 4KB?

更新

原因与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 肯定可以避免两个块之间的页面和缓存浪费。这可能已经是速度差异的原因了。

关于performance - memcpy() 的速度受 malloc() 不同方式的影响很大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21089397/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com