Согласно C++
предсказанию с учетом ветвлений, я подготовил тест, чтобы увидеть, насколько он эффективен.
Итак, в контрольной выборке я пишу:
int count=0;
for (auto _ : state) {
if(count%13==0) {
count+=2;
}
else
count++;
benchmark::DoNotOptimize(count);
}
В C++11
предсказании ветвления я пишу:
#define LIKELY(condition) __builtin_expect(static_cast<bool>(condition), 1)
#define UNLIKELY(condition) __builtin_expect(static_cast<bool>(condition), 0)
int count=0;
for (auto _ : state) {
if(UNLIKELY(count%13==0)) {
count+=2;
}
else
count++;
benchmark::DoNotOptimize(count);
}
В C++20
,
int count=0;
for (auto _ : state) {
if(count%13==0)[[unlikely]]{
count+=2;
}
else
count++;
benchmark::DoNotOptimize(count);
}
, который, к сожалению, не поддерживается в quick-bench
.Но в любом случае, я оставляю это там.
Теперь, получение эталона под gcc и clang не показывает эффективности для такого базового примера.
Я что-то не так делаю?
![c++ branch-aware prediction](https://i.stack.imgur.com/bGm1g.png)