C++备忘录072:连续内存和顺序内存访问是效率之友

本文探讨了C++中二维数组的两种不同访问方式——按行和按列——对效率的影响。实验显示,遵循连续内存访问的行访问模式相比列访问模式,能带来12倍的性能提升。当每行长度增加到10000000时,列访问速度反而提升,可能是由于推测执行的影响。
摘要由CSDN通过智能技术生成

一个有一百万个字符的vector作为二维数组,

bench_col首先从左到右,然后从上到下一行行的访问

bench_row首先从上到下,然后从左到右一列列的访问

其余所有的代码都一样,也就是说两个测试间实际上的不同只有

   for (int r = 0; r < LENGTH / COLS; ++r) {
   
     for (int c = 0; c < COLS; ++c) {
   

    for (int c = 0; c < COLS; ++c) {
   
      for (int r = 0; r < LENGTH / COLS; ++r) {
   

顺序的内存访问是缓存友好的,所以下面一行行的访问最快比一列列的访问快了12倍

Note:每行10000000的时候,按列访问的速度反而比以前快,speculate execution?

/*
10, 1000, 100000, 10000000 是每行的字符数

10
    bench_col           258211741.31ns     100.00%
    bench_row           307694281.85ns     119.16%
1000
    bench_col           259616779.23ns     100.00%
    bench_row           1903193476.23ns    733.08%
100000
    bench_col           300848588.79ns     100.00%
    bench_row           3740517015.64ns   1243.32%
10000000
    bench_col           293205620.36ns     100.00%
    bench_row           311550875.83ns     106.26%
*/
static void bench_col(benchmark::State& state) {
   
 auto v = std::
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值