测试目的
本次测试旨在比较不同数据结构(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()
方法,转而使用[]
访问方法。