请教一个 C++性能问题

查看 63|回复 8
作者:wisefree   
对于两个转置运算,两种的性能明显不一样,是为什么呢?
我电脑的输出是:
0.0473308
0.0265206
#include [i]
#include
int main(void)
{
    int I = 100;
    int J = 200;
    int K = 300;
   
    int idealI = 105;
    // i j k
    int* arr = new int[I * J * K];
    for (int i = 0; i  diffTime = endTime - startTime;
    std::cout
bfjm   
不能这样一起测吧 cpu cache 命中率不一样
awenxjtu   
cpu 有缓存,缓存的访问速度比内存的访问速度快的多,另外缓存会一大块一大块的和内存交换数据以提高内存的访问速度。第一个 for 循环写法基本上是连续访问内存地址,内存地址基本上会命中缓存中的数据;而第二种写法访问的内存中的地址一会儿这里一会儿那里距离比较远就很可能访问的数据不在缓存中,这样就要等待从内存中读取数据,所以就比第一种写法慢了。
JARK006   
简单试了一下,结论就是:第一个三重 for 跑的时候,数据还没完全载入 CPU 缓存,到第二次三重 for 的时候,此时数据都在 CPU 高速缓存里了,数据命中率高,自然就快了。
你互换一下这俩三重 for ,结果也是第一次的就是慢点。或者再拿个 for 把他俩包起来跑 10 次就发现,开始几次就是慢点,后面都一样快了
neocanable   
把这段代码编译出来,拿 IDA 反编译一下
第一个循环:
```
  for ( m = 0; m > There are only two hard things in Computer Science: cache invalidation and naming things.
ty29022   
但我有些疑惑的是这个数据量以现代 cpu 的缓存大小来说应该没多大区别才是
ty29022   
@ty29022 warm cache 对性能影响比较大   https://img.picui.cn/free/2024/11/08/672e1695ad332.png
bfjm   
new 的时候并没有实际分配到内存,所以第一次访问的时候都是未命中,比较耗时
lzoje   
@ty29022 100*200*300*4b=22.88MB “现代 CPU”的 L1 缓存您认为是多少?
您需要登录后才可以回帖 登录 | 立即注册

返回顶部