这个问题可能有点奇怪,但我想知道是否有一种方法 NOT 在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
版本相同。
两次跑步的差异有所减少但问题仍然存在:“如何规范第一次和第二次跑步的运行时间”?
答案 0 :(得分:1)
基准测试,特别是微基准测试是一个相当复杂的场景,有很多方法可能会无意中收集错误的性能数据。您应该查看微基准测试库,例如google/benchmark,并使用其中一个来执行测试。
从您的示例中可以看出,外部因素(如文件系统缓存)可能会导致单个运行的时间变化很大。
答案 1 :(得分:0)
以下是我用于Windows drivepeed32基准测试的代码(免费资料 - Google用于drivespeed32),后面是通过Windows 7获得2000 MB文件的结果,以及用于较小文件的缓存速度。还显示了Linux版本的代码。
if (useCache)
{
hFile = CreateFile(testFile, GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
}
else
{
hFile = CreateFile(testFile, GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN
| FILE_FLAG_NO_BUFFERING, NULL);
}
if (hFile == INVALID_HANDLE_VALUE)
{
SetCurrentDirectory(currentDir);
printf (" Cannot open data file for reading\n\n");
fprintf (outfile, " Cannot open data file for reading\n\n");
fclose(outfile);
printf(" Press Enter\n");
g = getchar();
return 0;
}
Intended for smaller files like 8, 16, 32 MB, so times out after 1 set.
2000 MB File 1 2 3 4 5
Writing MB/sec 85.51 85.40 85.64 83.79 83.19
Reading MB/sec 84.34 85.77 85.60 85.88 85.15
Running Time Too Long At 246 Seconds - No More File Sizes
---------------------------------------------------------------------
8 MB Cached File 1 2 3 4 5
Writing MB/sec 1650.43 1432.86 1536.61 1504.16 1481.58
Reading MB/sec 2225.53 2361.99 2271.81 2235.04 2316.13
Linux Version
if (useCache)
{
handle = open(testFile, O_RDONLY);
}
else
{
handle = open(testFile, O_RDONLY | O_DIRECT);
}
if (handle == -1)
{
printf (" Cannot open data file for reading\n\n");
fprintf (outfile, " Cannot open data file for reading\n\n");
fclose(outfile);
printf(" Press Enter\n");
g = getchar();
return 0;
}