一个有一百万个字符的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::