В любом случае, по поводу вашего вопроса ... первый цикл не имеет зависимости внутри цикла, т.е. каждая итерация цикла независима и может быть рассчитана как можно скорее (фактически все, кроме последней итерации, могут быть просто отброшены, потому что онивообще не влияет на возвращаемое значение).
Второй цикл для каждой итерации зависит от предыдущего результата, поэтому ЦП должен ждать с каждым следующим imul
, пока предыдущий результат не будет готов.Полагаю, что imul
на современном x86 все еще имеет пропускную способность около 1,0, но задержка может быть выше 1,0, и неуверенность в том, что сделает зависимость, полностью зависит от вашей целевой платформы ЦП, которую вы не указали.(кто-то, например Питер Кордес, наверняка может ответить на этот вопрос для конкретных современных микроархитектур Intel, или вы можете сами прочитать таблицы Агнера, но поскольку вы не указали целевую архитектуру, я не вижу смысла в том, чтобы делать какой-то конкретный пример из реального мира для меняэтого общего уровня чит-чата достаточно)
Например, на 80386, я думаю, второй цикл будет быстрее, потому что в нем меньше инструкций, а 80386 по-прежнему довольно «прост» внутри, а imul
занимает несколькочасы в любом случае.На последних процессорах Intel зависимость, вероятно, будет просто так, поэтому склоняется в пользу первого, но не сильно, так как imul
достаточно быстр сегодня.
В любом случае, это хороший пример того, как сортировать ваш алгоритмво-первых, и его настройка даст вам наибольший прирост производительности, поскольку первый цикл не является реальным циклом, а написание его в виде простой формулы сделает код еще быстрее.
Как ни странно, я попытался в Godboltexplorer, что современные компиляторы делают с этим, и gcc делает довольно сложную вещь, чтобы прочитать каждый член массива, или что именно делает эта стена инструкций (слишком ленив, чтобы проверять в отладчике), в то время как компилятор clang просматривает его и производитвместо упрощенной формулы: https://godbolt.org/g/p2MGHs
PS первый цикл может быть упрощен до:
int loop1_fix(int *a, int x, int n) {
if (0 < n) return a[n-1]*x*x*x*x;
else return x*x*x;
}