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\) 个数排序。
本文来自博客园,作者:caijianhong,转载请注明原文链接:https://www.cnblogs.com/caijianhong/p/18615080