有没有办法在c++中不使用缓存

Is there a way not to use cache in c++

本文关键字:缓存 c++ 有没有      更新时间:2023-10-16

这个问题可能有点奇怪,但我想知道是否有办法NOT在c++中使用缓存。

我正在做一些测试,在这个测试中,我将2 GB (512*4 MB matrices)加载到内存中,然后在它们之间进行一些相关性并计算性能。

当我运行第一次运行的代码时,运行时间为t1+x second,在第二次运行,总时间为t2+x seconds,其中t1t2是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;
}