有没有办法在c++中不使用缓存
Is there a way not to use cache in c++
这个问题可能有点奇怪,但我想知道是否有办法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
的缓存使用版本相同。
两次跑步的差异缩小了,但问题仍然存在:"如何规范第一次和第二次跑步的时间"?
基准测试,特别是微观基准测试是一个非常复杂的场景,有很多方法可能会无意中收集到错误的性能数据。您应该查看微观基准测试库,如google/beach,并使用其中一个库来执行测试。
从您的示例中可以看出,文件系统缓存等外部因素可能会导致单个运行的时间差异很大。
下面是我在Windows drivespeed32基准测试中使用的代码(免费的东西-Google for drivespeed3),然后是通过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 readingnn");
fprintf (outfile, " Cannot open data file for readingnn");
fclose(outfile);
printf(" Press Entern");
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 readingnn");
fprintf (outfile, " Cannot open data file for readingnn");
fclose(outfile);
printf(" Press Entern");
g = getchar();
return 0;
}
- cmake更新缓存的变量
- 试图对缓存进行跨步测试,但程序并没有结束
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 通过ccmake在cmake中缓存依赖选项
- 使用宏扩展的泛型:为什么指令缓存使用不当?
- 如何使缓存线程安全
- 存储指令是否会阻止缓存未命中的后续指令?
- 缓存局部性与函数调用
- Qt 网页程序集缓存
- 多线程减慢程序速度:无错误共享,无互斥锁,无缓存未命中,无小工作量
- std::shared_ptr vs std::make_shared:意外的缓存未命中和分支预测
- 多个 rocksdb 实例:使用单个共享缓存还是多个独立缓存?
- 无法链接 LRU 缓存C++
- 空函数的参数是否加载到缓存中?
- 是否可以检查变量是否位于 L1/L2/L3 缓存中
- dynamic_cast每次调用是否比具有空检查的缓存变量更昂贵?
- C++:如何在从给定缓存中排除数字的同时生成随机数
- 如何对0,1,..中的k个随机数进行采样..,n-1,而不缓存到数组
- 缓存大量回调,然后批量调用它们,无需v表成本
- gcc 中的多个对齐属性是否可以用于保证缓存行分隔?