测试目的
本次测试旨在比较不同数据结构(vector
、数组)以及不同访问方法([]
、at()
、offset
)在性能上的差异,从而为开发者提供在特定情境下做出最佳选择的依据。
测试代码
测试网址:Quick C++ Benchmarks
使用GCC9.5 C++14 -O2编译
#include <benchmark/benchmark.h>static void vector_access(benchmark::State& state) {std::vector<int> v;for (int i = 0; i < 1000; ++i) {v.push_back(i);}for (auto _ : state) {for (int i = 0; i < 1000; ++i) {v[i] += 1;}}
}
BENCHMARK(vector_access);static void vector_access_by_at(benchmark::State& state) {std::vector<int> v;for (int i = 0; i < 1000; ++i) {v.push_back(i);}for (auto _ : state) {for (int i = 0; i < 1000; ++i) {v.at(i) += 1;}}
}
BENCHMARK(vector_access_by_at);static void array_access(benchmark::State& state) {int a[1000];for (int i = 0; i < 1000; ++i) {a[i] = i;}for (auto _ : state) {for (int i = 0; i < 1000; ++i) {a[i] += 1;}}
}
BENCHMARK(array_access);static void array_access_by_offset(benchmark::State& state) {int a[1000];for (int i = 0; i < 1000; ++i) {a[i] = i;}for (auto _ : state) {for (int i = 0; i < 1000; ++i) {*(a + i) += 1;}}
}
BENCHMARK(array_access_by_offset);static void heap_access(benchmark::State& state) {int *a = new int[1000];for (int i = 0; i < 1000; ++i) {a[i] = i;}for (auto _ : state) {for (int i = 0; i < 1000; ++i) {a[i] += 1;}}delete[] a;
}
BENCHMARK(heap_access);static void heap_access_by_offset(benchmark::State& state) {int *a = new int[1000];for (int i = 0; i < 1000; ++i) {a[i] = i;}for (auto _ : state) {for (int i = 0; i < 1000; ++i) {*(a + i) += 1;}}delete[] a;
}
BENCHMARK(heap_access_by_offset);
运行结果
Quick C++ Benchmarks
结论
-
vector
at()
方法访问速度最慢 -
栈上访问最快
-
其它情况经过O2优化后性能类似。
指导意见
-
追求最高效的访问速度:如果性能是首要考虑因素,建议使用栈上数组并采用
[]
访问方法。 -
避免使用
vector
的at()
方法:在对性能要求较高的场景下,应避免使用vector
的at()
方法,转而使用[]
访问方法。