vector<int>::push_back 与直接访问性能对比

vector 是提前开好空间然后每次 clear,vector2 是 reserve,list 就是 list,array 是对 vector vec[cur++] = i;。这里都是整数,push_back 与 emplace_back 整体没有什么区别,但有人要看,所以函数名前面加了 e 的是 emplace_back。

测试结果:array < vector = vector2 << list

2024-11-15T22:10:51+08:00
Running ./push_back
Run on (8 X 2419.2 MHz CPU s)
CPU Caches:
  L1 Data 48 KiB (x4)
  L1 Instruction 32 KiB (x4)
  L2 Unified 1280 KiB (x4)
  L3 Unified 8192 KiB (x1)
Load Average: 0.08, 0.02, 0.01
-----------------------------------------------------------------
Benchmark                       Time             CPU   Iterations
-----------------------------------------------------------------
bench_evector/100            59.5 ns         59.5 ns     12706596
bench_evector/1000            538 ns          538 ns      1260305
bench_evector/10000          5438 ns         5438 ns       131222
bench_evector/100000        82071 ns        82071 ns         8507
bench_evector/1000000      868177 ns       868180 ns          817
bench_evector2/100           73.6 ns         73.6 ns      9367293
bench_evector2/1000           536 ns          536 ns      1290501
bench_evector2/10000         5057 ns         5057 ns       137541
bench_evector2/100000       81939 ns        81939 ns         8573
bench_evector2/1000000     860870 ns       860872 ns          816
bench_elist/100              1240 ns         1240 ns       558806
bench_elist/1000            12513 ns        12513 ns        53484
bench_elist/10000          126142 ns       126143 ns         5498
bench_elist/100000        1302104 ns      1302107 ns          537
bench_elist/1000000      14266316 ns     14266308 ns           48
bench_vector/100             55.7 ns         55.7 ns     12734427
bench_vector/1000             536 ns          536 ns      1282267
bench_vector/10000           5360 ns         5360 ns       129287
bench_vector/100000         81479 ns        81479 ns         8613
bench_vector/1000000       878694 ns       878296 ns          806
bench_vector2/100            74.0 ns         74.0 ns      9416006
bench_vector2/1000            542 ns          542 ns      1286119
bench_vector2/10000          5053 ns         5053 ns       134027
bench_vector2/100000        81568 ns        81567 ns         8460
bench_vector2/1000000      852110 ns       852105 ns          803
bench_list/100               1291 ns         1291 ns       552344
bench_list/1000             12544 ns        12544 ns        56783
bench_list/10000           128511 ns       128511 ns         5560
bench_list/100000         1300553 ns      1300559 ns          549
bench_list/1000000       14576666 ns     14576566 ns           47
bench_array/100              35.2 ns         35.2 ns     19917275
bench_array/1000              300 ns          300 ns      2356720
bench_array/10000            2961 ns         2961 ns       237905
bench_array/100000          29223 ns        29198 ns        25397
bench_array/1000000        324843 ns       324845 ns         2077

测试代码:

#include <benchmark/benchmark.h>
#include <bits/stdc++.h>
using namespace std;
void bench_evector2(benchmark::State& state) {
  int n = state.range(0);
  for (auto _: state) {
    vector<int> vec;
    vec.reserve(n);
    for (int i = 0; i < n; i++) vec.emplace_back(i);
  }
}
void bench_elist(benchmark::State& state) {
  int n = state.range(0);
  for (auto _: state) {
    list<int> vec;
    for (int i = 0; i < n; i++) vec.emplace_back(i);
  }
}
void bench_evector(benchmark::State& state) {
  int n = state.range(0);
  vector<int> vec(n);
  for (auto _: state) {
    vec.clear();
    for (int i = 0; i < n; i++) vec.emplace_back(i);
  }
}
void bench_vector2(benchmark::State& state) {
  int n = state.range(0);
  for (auto _: state) {
    vector<int> vec;
    vec.reserve(n);
    for (int i = 0; i < n; i++) vec.push_back(i);
  }
}
void bench_list(benchmark::State& state) {
  int n = state.range(0);
  for (auto _: state) {
    list<int> vec;
    for (int i = 0; i < n; i++) vec.push_back(i);
  }
}
void bench_vector(benchmark::State& state) {
  int n = state.range(0);
  vector<int> vec(n);
  for (auto _: state) {
    vec.clear();
    for (int i = 0; i < n; i++) vec.push_back(i);
  }
}
void bench_array(benchmark::State& state) {
  int n = state.range(0);
  vector<int> vec(n);
  for (auto _: state) {
    int cur = 0;
    for (int i = 0; i < n; i++) vec[cur++] = i;
  }
}
#define generate_test(name) BENCHMARK(bench_##name)->RangeMultiplier(10)->Range(100, 1000000);
generate_test(evector);
generate_test(evector2);
generate_test(elist);
generate_test(vector);
generate_test(vector2);
generate_test(list);
generate_test(array);
BENCHMARK_MAIN();
posted @ 2024-11-15 22:15  caijianhong  阅读(77)  评论(0编辑  收藏  举报