Выполнение прогноза ветвления в цикле

Будет ли заметная разница в скорости между этими двумя фрагментами кода? Наивно, я думаю, что второй фрагмент будет быстрее, потому что инструкции ветвления встречаются намного меньше, но, с другой стороны, предиктор отрасли должен решить эту проблему. Или у него будут заметные накладные расходы, несмотря на предсказуемую картину? Предположим, что инструкция условного перемещения не используется.

Фрагмент 1:

for (int i = 0; i < 100; i++) {
    if (a == 3)
        output[i] = 1;
    else
        output[i] = 0;
}

Фрагмент 2:

if (a == 3) {
    for (int i = 0; i < 100; i++)
        output[i] = 1;
} else {
    for (int i = 0; i < 100; i++)
        output[i] = 0;
}

Я не собираюсь самостоятельно оптимизировать эти случаи, но мне хотелось бы узнать больше об издержках ветвей даже с предсказуемым шаблоном.

2
03 сент. '12 в 19:08
источник поделиться
2 ответов

Так как a остается неизменным после входа в цикл, не должно быть большой разницы между двумя фрагментами кода.

Лично я бы предпочел первое, если предсказатель ветвления не сможет предсказать ветвь, которая действительно маловероятна, учитывая, что a остается неизменным в цикле.

Кроме того, компилятор может выполнить эту оптимизацию:

благодаря чему оба фрагмента кода генерируют точно такие же машинные команды.

3
03 сент. '12 в 19:17
источник

Вы задали вопрос о производительности без указания аппаратного обеспечения (хотя из вопроса мы можем сделать вывод, что это одна из архитектур с предсказанием ветвления), toolchain или компиляции.

В целом, это просто другое пространство против компромисса скорости, где пространство часто само влияет на скорость (инструкции процессора и кэши для микрокодов).

Единственный разумный ответ: " Производительность будет варьироваться в зависимости от аппаратного обеспечения процессора и оптимизации компилятора."

1
03 сент. '12 в 19:28
источник

Посмотрите другие вопросы по меткам или Задайте вопрос