Современные процессоры обладают конвейерной архитектурой. Это означает, что каждая ассемблерная операция разбивается на несколько микроопераций. В свою очередь микрооперации последовательно выполняются на разных устройствах процессора. Одновременно процессор может выполнять несколько операций. Лишь бы только они не зависели друг от друга. Зависимость заключается в том, что для выполнения следующей операции требуются данные предыдущей операции. С этой зависимостью ничего нельзя сделать на уровне процессора, можно только распаралелить программу. Но можно попытаться начать заранее выполнять ветви исполнения. Для этого, предсказывается результат ветвления и процессор исполняет код по ветви. Если предсказание оказывается неправильным, результаты вычислений отбрасываются и мы теряем в производительности.

О том как различные процессоры предсказывают ветвления можно прочитать у Агнера Фога. Этот материал предназначен для писателей компиляторов, для общего ознакомления читать мануал довольно скучно, много повторяющихся моментов для разных процессоров. Материал изложен очень кратко и сжато.

Гораздо более захватывающим мне показался вопрос про массивы на stackoverflow. В ветке обсуждения много хаков, которые можно использовать для уменьшения ветвления в программе. Присутствуют ссылки на интересненые материалы и статьи. Основной посыл в том, что заботиться о сбросе конвейера нужно только в критических секциях кода. Эти секции лучше не искать на глазок, а пользоваться инструментами, профилировщиками.