这个问题可能有点奇怪,但我想知道是否有办法NOT在c++中使用缓存。
我正在做一些测试,在这个测试中我正在加载 2 GB(512*4 MB 矩阵)
到内存,然后在它们之间做一些关联并计算性能。
当我运行1st run的代码时,运行时间是t1+x second
,在2nd run中,总时间是 t2+x seconds
,其中 t1
和 t2
是 2 GB 矩阵的加载时间,t1 > t2
。 (大约 t1=20,t2=5 秒)
。我的假设是因为在第二次运行中使用了缓存。 (我不知道是否还有任何其他原因会像这样减少加载时间。)
我的问题是,由于加载时间没有标准,因此在某些情况下结果具有欺骗性。所以我想要一个 IO 时间标准。我唯一想到的是如果有办法就不要使用缓存。
有没有办法标准化我的 IO 时间?
我正在使用 Windows 7 x64 并在 visual studio 2010 上工作,我的 RAM 是 32 GB。
测试结果:我比较了 4MB 二进制文件在 5 个选项中的平均加载时间。
选项是第 1 次使用我的原始代码运行,第 2 次使用原始代码运行,使用 FILE_FLAG_NO_BUFFER,第 1 次使用缓存运行,第 2 次按照 Roy Longbottom
的建议运行。
1st run : 39.1 ms
2nd run : 10.4 ms
no_buffer : 127.8 ms
cache_1st run : 27.4 ms
cache_2nd run : 19.2 ms
我原来的读取代码如下:
void readNoise(string fpath,Mat& data){
FILE* fp = fopen(fpath.c_str(),"rb");
if (!fp)perror("fopen");
float* buffer= new float[size];
for(int i=0;i<size;++i) {
fread(buffer,sizeof(float),size,fp);
for(int j=0;j<size;++j){
data.at<float>(i,j)=buffer[j];
}
}
fclose(fp);
free(buffer);
}
我注意到我的代码中有一个错误是动态分配,当我将动态分配更改为静态分配时,readNoise
方法的运行时间与 Roy Longbottom 的缓存使用版本相同
。
两次运行的差异减小了,但问题仍然存在:“如何标准化第一次和第二次运行的运行时间”?
最佳答案
基准测试,特别是微基准测试是一个相当复杂的场景,您可能会通过多种方式无意中收集到错误的性能数据。您应该查看微型基准测试库,例如 google/benchmark并使用其中之一来执行您的测试。
从您的示例中可以看出,文件系统缓存等外部因素可能会导致各个运行的时间差异很大。
关于c++ - 有没有办法在 C++ 中不使用缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25899806/