В C ++, если рекурсивная функция является шаблонной, тогда у компилятора больше шансов оптимизировать ее, поскольку все дедукции типов и реализации функций будут происходить во время компиляции. Современные компиляторы также могут встроить функцию, если это возможно. Так что если использовать флаги оптимизации, такие как -O3
или -O2
в g++
, рекурсии могут иметь шанс быть быстрее, чем итерации. В итерационных кодах компилятор получает меньше возможностей для его оптимизации, поскольку он уже находится в более или менее оптимальном состоянии (если он написан достаточно хорошо).
В моем случае я пытался реализовать матричное возведение в степень путем возведения в квадрат с использованием матричных объектов Armadillo, как рекурсивным, так и итерационным способом. Алгоритм можно найти здесь ... https://en.wikipedia.org/wiki/Exponentiation_by_squaring.
Мои функции были шаблонными, и я вычислил 1,000,000
12x12
матриц, возведенных в степень 10
. Я получил следующий результат:
iterative + optimisation flag -O3 -> 2.79.. sec
recursive + optimisation flag -O3 -> 1.32.. sec
iterative + No-optimisation flag -> 2.83.. sec
recursive + No-optimisation flag -> 4.15.. sec
Эти результаты были получены с использованием gcc-4.8 с флагом c ++ 11 (-std=c++11
) и Armadillo 6.1 с Intel MKL. Компилятор Intel также показывает аналогичные результаты.