我有一段简单的C代码,其功能如下(伪代码):
#define N 100000000
int *DataSrc = (int *) malloc(N);
int *DataDest = (int *) malloc(N);
memset(DataSrc, 0, N);
for (int i = 0 ; i < 4 ; i++) {
StartTimer();
memcpy(DataDest, DataSrc, N);
StopTimer();
}
printf("%d\n", DataDest[RandomInteger]);
我的电脑配置: Intel Core i7-3930,搭载有 4x4GB DDR3 1600 内存,运行 RedHat 6.1 64 位操作系统。
第一个 memcpy()
的速度为 1.9 GB/s,而接下来的三个则以 6.2 GB/s 的速度执行。
由于缓存效应无法导致这么大的差异,所以我的第一个问题是:
- 为什么第一个
memcpy()
如此缓慢?也许是因为malloc()
直到使用时才完全分配了内存?
如果我取消 memset()
,那么第一个 memcpy()
的速度将约为 1.5 GB/s,
而接下来的三个则以 11.8 GB/s 的速度运行。 速度提升了近2倍。 我的第二个问题是:
- 如果我不调用
memset()
,为什么memcpy()
会快2倍?