【发布时间】:2014-11-12 00:50:18
【问题描述】:
这个问题可能有点奇怪,但我想知道是否有办法不在 c++ 中使用缓存。
我正在做一些测试,在这个测试中,我将2 GB (512*4 MB matrices) 加载到内存中,然后在它们之间做一些相关性并计算性能。
当我为第一次运行运行代码时,运行时间为t1+x second,在第二次运行中,总时间为t2+x seconds,其中t1和t2 是2 GB 矩阵和t1 > t2 的加载时间。 (approx. t1=20, t2=5 sec)。我的假设是因为在第二次运行中使用了缓存。 (我不知道是否还有其他原因会减少这样的加载时间。)
我的问题是由于加载时间没有标准,因此在某些情况下结果具有欺骗性。所以我想要一个 IO 时间的标准。如果有办法,我唯一想到的就是不要使用缓存。
有没有办法标准化我的 IO 时间?
我使用的是 Windows 7 x64 并在 Visual Studio 2010 上工作,我的 RAM 为 32 GB。
测试结果:我在 5 个选项中比较了 4MB 二进制文件的平均加载时间。
选项是第一次运行我的原始代码,第二次运行原始代码,使用 FILE_FLAG_NO_BUFFER,第一次运行使用缓存,第二次运行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 的缓存使用版本相同。
两次运行的差异减小了,但问题仍然存在:“如何标准化第一次和第二次运行的运行时间”?
【问题讨论】:
-
当您说“缓存”时,您的意思是“文件系统缓存”吗?既然你提到了 I/O。
-
假设你的意思是文件系统缓存,是的,可能有一种方法——但我知道的所有方法都是不可移植的,所以你需要告诉我们你是什么操作系统'在我们可以(可能)提供很多帮助之前重新合作。
-
我想是的,我不知道缓存的细节。
-
有时在性能检查时我会忽略第一次运行。
-
既然如此,您可以使用
CreateFile打开文件,并指定FILE_FLAG_NO_BUFFERING,看看这是否至少有助于获得更一致的结果。您可以使用_open_osfhandle和_fdopen至少获得C 风格的FILE *,这样您就可以使用fread之类的内容来阅读,而不是直接使用ReadFile。
标签: c++ performance caching memory io