1e6 个 vector 做 1e6 次随机 push_back 非常慢

测试代码:

点击查看代码
#include <benchmark/benchmark.h>
#include <bits/stdc++.h>
using namespace std;
constexpr int N = 1e6 + 10;
mt19937 rng{random_device{}()};
void bench_0(benchmark::State& state) {
  for (auto _ : state) {
    for (int i = 0; i < N; i++) benchmark::DoNotOptimize(rng() % N);
  }
}
void bench_vector(benchmark::State& state) {
  static vector<int> vec[N];
  for (auto _ : state) {
    for (int i = 0; i < N; i++) vec[rng() % N].push_back(i);
    benchmark::DoNotOptimize(0);
  }
}
void bench_basic_string(benchmark::State& state) {
  static basic_string<int> vec[N];
  for (auto _ : state) {
    for (int i = 0; i < N; i++) vec[rng() % N].push_back(i);
    benchmark::DoNotOptimize(0);
  }
}
void bench_sort(benchmark::State& state) {
  static int a[N];
  for (auto _ : state) {
    for (int i = 0; i < N; i++) a[i] = rng() % N;
    sort(a, a + N);
    benchmark::DoNotOptimize(0);
  }
}
#define generate_test(name) BENCHMARK(bench_##name);
generate_test(0)
generate_test(vector)
generate_test(basic_string)
generate_test(sort)
BENCHMARK_MAIN();

测试结果:

2024-12-18T15:23:07+08:00
Running ./fma
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.12, 0.05, 0.01
-------------------------------------------------------------
Benchmark                   Time             CPU   Iterations
-------------------------------------------------------------
bench_0               2871910 ns      2964141 ns          235
bench_vector         94098408 ns     97120233 ns            6
bench_basic_string   60124253 ns     62055840 ns           10
bench_sort           58999936 ns     60893836 ns           11

bench_0 是随机生成 \(10^6\) 个数(对照组),bench_vector 为 1e6 个 vector 做 1e6 次随机 push_back,bench_basic_string 是将 vector 换为 basic_string,bench_sort 是对 \(10^6\) 个数排序。

posted @ 2024-12-18 15:31  caijianhong  阅读(46)  评论(0编辑  收藏  举报