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

标签 c++ performance caching memory io

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

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

当我运行1st run的代码时,运行时间是t1+x second,在2nd run中,总时间是 t2+x seconds,其中 t1t2 是 2 GB 矩阵的加载时间,t1 > t2(大约 t1=20,t2=5 秒)。我的假设是因为在第二次运行中使用了缓存。 (我不知道是否还有任何其他原因会像这样减少加载时间。)

我的问题是,由于加载时间没有标准,因此在某些情况下结果具有欺骗性。所以我想要一个 IO 时间标准。我唯一想到的是如果有办法就不要使用缓存。

有没有办法标准化我的 IO 时间

我正在使用 Windows 7 x64 并在 visual studio 2010 上工作,我的 RAM 是 32 GB。

测试结果:我比较了 4MB 二进制文件在 5 个选项中的平均加载时间。 选项是第 1 次使用我的原始代码运行,第 2 次使用原始代码运行,使用 FILE_FLAG_NO_BUFFER,第 1 次使用缓存运行,第 2 次按照 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/benchmark并使用其中之一来执行您的测试。

从您的示例中可以看出,文件系统缓存等外部因素可能会导致各个运行的时间差异很大。

关于c++ - 有没有办法在 C++ 中不使用缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25899806/

相关文章:

Android Glide 获取不到最新版图片

使用 -O1 编译时 C++ regex_search 中断

c++ - 为什么...(三点)在 catch block 中存在?

wcf - 在 Silverlight 应用程序中使用 datacontractserializer 进行反序列化的性能非常慢

c++ - 获取线程 ID 在性能方面是否昂贵?

ios - 如何在 iOS 中缓存 NSDATA json

c++ - 对重载函数的模糊调用 - log 与 ptrdiff_t

c++ - Boost::‘operator[]’ 的函数错误模糊重载

java - 是否有以微代码运行 Java 的 CPU?

php - XDebug 能否单独跟踪探查器调用所花费的时间?