Я хотел бы добавить свой ответ, потому что, хотя ответ Торбьерна Гилбертинга хорош, он не полный IMO
Существуют различные улучшения из-за развертывания:
Алгоритмическое улучшение - например, ваш набор инструкций позволяет обрабатывать четыре, а не один байт.Торбьерн ответил, что отлично.
Уменьшить накладные расходы цикла , когда тело цикла мало, накладные расходы цикла (обычно приращение + сравнение + скачок ) потребляют значительное количествовремя.
total cost = N * (loop body + loop overhead)
при однократном развертывании вы получите
total cost = N/2 * (2 * loop body + loop overhead)
= N * loop body + N / 2 * loop overhead
, если издержки цикла невелики по сравнению с телом цикла, развертывание не даст вам никакой выгоды за счет увеличения размера кода.Пример: когда тело цикла имеет 10-кратное накладные расходы, развертывание дает в лучшем случае улучшение на 5%.
Лучшее соединение - на архитектурах с несколькими конвейерами (или квазипарированием, например, переименованием регистров и генерацией микрокода) развертывание может дать гораздо лучшие возможности для сопряжения.Опять же, они будут заметны, только когда тело цикла мало, но формула не может быть дана так просто, как указано выше.
Развертывание не безвредно - имейте в виду, что развертываниедаже в «хороших» случаях размер кода цикла почти удваивается.Это может удалить другой код или данные из вашего кэша.На современных настольных архитектурах проблемы с размером кода достаточно серьезны, поэтому практическое правило заключается в том, чтобы оптимизировать размер кода на глобальном уровне и оптимизировать для скорости только локальные точки доступа.