C++备忘录073:连续内存和顺序内存访问是效率之友,更显著的例子

Destination: C++ Crash Course - Data Oriented Design启发

对比的两者:

  • 传统的一个64字节长的类,然后用vector存储一堆这种类的对象,Array of Structs (AOS)
  • 一个大对象,其中每个成员对应传统类中一个成员的数组,Struct of Arrays(SOA)

然后更新其中一个成员的所有值/所有成员的对应值

struct S {
   
	int v00;
	int v01;
	;;;
};

vector<S> s;
for_each_member_of(s, update_v00);

vs

struct V {
   
	vector<int> v00s;
	vector<int> v01s;
	;;;
};

V v;
v.update_all_v00_in_v00s();

结果是第二种比第一种性能可以高一个量级

perf比较数组长1<<12个整型的情况下,第二种的L1数据缓存miss的比例是110%,第一种的对应值是0.62%

/*
`bench_objo`:
       245,988,557      L1-dcache-loads           #  341.951 M/sec                    (71.66%)
       268,262,751      L1-dcache-load-misses     #  109.05% of all L1-dcache hits    (70.97%)

`bench_data`:
       717,040,256      L1-dcache-loads           # 1072.944 M/sec                    (71.74%)
         4,439,286      L1-dcache-load-misses     #    0.62% of all L1-dcache hits    (70.48%)

4
    bench_data                1.90ns    100.00%
    bench_objo                6.02ns    317.05%
5
    bench_data                5.17ns    100.00%
    bench_objo               11.91ns    230.45%
6
    bench_data                9.53ns    100.00%
    bench_objo               24.99ns    262.08%
7
    bench_data               19.41ns    100.00%
    bench_objo               46.92ns    241.70%
8
    bench_data               34.11ns    100.00%
    bench_objo               85.85ns    251.71%
9
    bench_data               57.34ns    100.00%
    bench_objo              181.39ns    316.32%
10
    bench_data              103.42ns    100.00%
    bench_objo             1194.71ns   1155.22%
11
    bench_data              200.35ns    100.00%
    bench_objo             2473.34ns   1234.52%
12
    bench_data              388.90ns    100.00%
    bench_objo             5420.23ns   1393.74%
*/

#include <algorithm>

#include <benchmark/benchmark.h>

#include "mx.hpp"

class S {
   
  int v00 = 7;
  int v01 = 7;
  int v02 = <
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值