Box = mean ± 0.675σ (normal 25th/75th percentile) · Whiskers = mean ± 2.5σ · Centre line = median · × = mean
| Benchmark | MSVC 19 | GCC 15.2 | Clang 21.1 |
|---|---|---|---|
BM_CBaselineMyStruct* vec = (MyStruct*)new std::byte[ sizeof(MyStruct) * N ];
for (size_t i = 0; i < N; ++i) {
::new (static_cast<void*>(vec+i)) MyStruct(i, i);
}
delete[] vec;
benchmark::DoNotOptimize(vec); | 850.2 ±41.5 ★ | 822.2 ±40.4 ★ | 929.5 ±88.3 ★ |
BM_CBaseline2MyStruct* vec = (MyStruct*)new std::byte[ sizeof(MyStruct) * N ];
for (size_t i = 0; i < N; ++i) {
vec[i] = MyStruct(i,i);
}
delete[] vec;
benchmark::DoNotOptimize(vec); | 2897.1 ±69.8 ★ | 845.2 ±43.9 ★ | 915.4 ±97.7 ★ |
BM_CBaseline3MyStruct* vec = (MyStruct*)new std::byte[ sizeof(MyStruct) * N ];
for (size_t i = 0; i < N; ++i)
std::construct_at(vec + i, static_cast<int>(i), static_cast<int>(i));
delete[] vec;
benchmark::DoNotOptimize(vec); | 842.2 ±47.0 ★ | 831.1 ±45.5 ★ | 905.6 ±69.9 ★ |
BM_EmplaceBackstd::vector<MyStruct> vec;
vec.reserve(N);
for (size_t i = 0; i < N; ++i) {
vec.emplace_back(i, i);
}
benchmark::DoNotOptimize(vec); | 1006.4 ±63.5 ★ | 969.5 ±33.5 ★ | 1123.8 ±83.4 ★ |
BM_FromRangestd::vector<MyStruct> vec( std::from_range,
std::views::iota(0uz,N) |
std::views::transform(
[](size_t i){
return MyStruct(i,i);
}) );
benchmark::DoNotOptimize(vec); | 2913.9 ±60.2 ★ | 839.4 ±28.2 ★ | 915.9 ±65.6 ★ |
BM_FromRangeIteratorsauto range = std::views::iota(0uz,N) |
std::views::transform(
[](size_t i){
return MyStruct(i,i);
});
std::vector<MyStruct> vec( std::begin(range), std::end(range) );
benchmark::DoNotOptimize(vec); | 2909.9 ±71.3 ★ | 836.1 ±35.2 ★ | 934.6 ±94.7 ★ |
BM_PushBackstd::vector<MyStruct> vec;
vec.reserve(N);
for (size_t i = 0; i < N; ++i) {
MyStruct obj(i, i);
vec.push_back(obj);
}
benchmark::DoNotOptimize(vec); | 3021.9 ±87.8 ★ | 970.6 ±61.1 ★ | 1186.0 ±99.3 ★ |