我有简单的C代码(psuedo代码):
#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]);
我的电脑:英特尔酷睿i7-3930,配备4x4GB DDR3 1600内存,运行RedHat 6.1 64位.
第一个memcpy()以1.9 GB /秒的速度发生,而接下来的三个以6.2 GB /秒的速度发生.缓冲区大小(N)太大,不能由缓存效果引起.所以,我的第一个问题:为什么第一个memcpy()这么慢?也许malloc()在你使用之前不会完全分配内存?
如果我删除了memset(),那么第一个memcpy()以大约1.5 GB /秒的速度运行,但接下来的三个以11.8 GB /秒的速度运行.几乎是加速的2倍.我的第二个问题:如果我不调用memset(),为什么memcpy()会快2倍?