我需要用下面的代码的性能帮助。 它还对任意大小的两个动态分配的数组a的memcpy:
int main()
{
double *a, *b;
unsigned n = 10000000, i;
a = malloc(n*sizeof(double));
b = malloc(n*sizeof(double));
for(i=0; i<n; i++) {
a[i] = 1.0;
/* b[i] = 0.0; */
}
tic();
bzero(b, n*sizeof(double));
toc("bzero1");
tic();
bzero(b, n*sizeof(double));
toc("bzero2");
tic();
memcpy(b, a, n*sizeof(double));
toc("memcpy");
}
TIC / TOC测量的执行时间。
在我的电脑需要0.035s memcpy的(Linux操作系统,gcc版本4.4.6)。 如果我现在取消注释它初始化目标数组b中的行,代码快三倍(!) - 0.011s。
我已经使用循环代替了memcpy时观察到类似的行为。 通常我并不关心这个,因为它是足够使用它之前,“初始化”的记忆。 不过,我现在需要执行一个简单的内存拷贝,并做到这一点尽可能快。 对数据进行初始化需要编写例如0到存储器,这是没有必要的,需要时间。 我愿与所有可用内存带宽进行内存复制。
是否有一个解决这个问题? 或者是它连接到Linux处理动态内存(某种懒页分配?),不能被周围的工作方式? 它是如何在其他系统上?
编辑:同样的结果与GCC 4.6获得。 我用-O3进行编译。
编辑:谢谢大家的意见。 我也明白,内存映射需要时间。 我想我只是有一个很难接受,它需要这么长时间,比实际内存访问更长的时间。 代码已被修改为包括阵列的初始化的基准b。使用两个后续bzero呼叫。 时序现在证明
bzero1 0.273981
bzero2 0.056803
memcpy的0.117934
显然,第一bzero呼叫确实远不止流零记忆-这是内存映射和内存归零。 在另一方面,第二bzero调用需要的做的memcpy所需的时间,而这正是预期的一半 - 只写时间与读写时间。 据我所知,第二bzero调用的开销必须有因OS安全原因。 什么休息? 我不能莫名其妙地减少它,例如使用更大的内存页? 不同的内核设置?
我要指出,我在Ubuntu喘息运行此。