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

时间:2014-09-17 20:29:48

标签: c++ performance caching memory io

这个问题可能有点奇怪,但我想知道是否有一种方法 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版本相同。

两次跑步的差异有所减少但问题仍然存在:“如何规范第一次和第二次跑步的运行时间”?

2 个答案:

答案 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;
}