gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:21:17 25 4
gpt4 key购买 nike

这个问题可能有点奇怪,但我想知道是否有办法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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com