Основываясь на моем предыдущем опыте с тестами transform и for_each, они обычно работают немного быстрее, чем raw-циклы, и, конечно, они безопаснее, поэтому я попытался заменить все свои raw-циклы на transform, generate и for_each. Сегодня я сравнил, как быстро я могу переворачивать логические значения, используя циклы for_each, transform и raw, и я получил очень удивительные результаты. raw_loop работает в 5 раз быстрее, чем два других. Я не смог найти вескую причину, почему мы получаем такую огромную разницу?
#include <array>
#include <algorithm>
static void ForEach(benchmark::State& state) {
std::array<bool, sizeof(short) * 8> a;
std::fill(a.begin(), a.end(), true);
for (auto _ : state) {
std::for_each(a.begin(), a.end(), [](auto & arg) { arg = !arg; });
benchmark::DoNotOptimize(a);
}
}
BENCHMARK(ForEach);
static void Transform(benchmark::State& state) {
std::array<bool, sizeof(short) * 8> a;
std::fill(a.begin(), a.end(), true);
for (auto _ : state) {
std::transform(a.begin(), a.end(), a.begin(), [](auto arg) { return !arg; });
benchmark::DoNotOptimize(a);
}
}
BENCHMARK(Transform);
static void RawLoop(benchmark::State& state) {
std::array<bool, sizeof(short) * 8> a;
std::fill(a.begin(), a.end(), true);
for (auto _ : state) {
for (int i = 0; i < a.size(); i++) {
a[i] = !a[i];
}
benchmark::DoNotOptimize(a);
}
}
BENCHMARK(RawLoop);
clang++ (7,0) -O3 -libС++ (LLVM)