Я пытаюсь оценить разницу в производительности, используя constexpr
. Я использую следующий код:Хуже работы с constexpr?
#include<iostream>
using namespace std;
constexpr double factorial(int n) {
return n==0?1:n*factorial(n-1);
}
main() {
double a=0;
for(int i=0;i<10000000;i++) {
a+=factorial(100);
}
cout<<a<<endl;
}
Я попробовал две версии выше программы, одна из которых функции факториала как constexpr
, и один без. Я ожидал увидеть, что версия constexpr
работает лучше во время выполнения, но на самом деле она работает медленнее. Вот измерения (в секундах) от 4 испытаний каждый:
Без constexpr
:
2,691, 2,835, 2,768, 2,748
С constexpr
:
2,910, 2,920, 2,903, 2,910
Может ли кто-нибудь объяснить причину этого? Использую ли я constexpr
неправильно? Я использую g ++ 4.9.1, и я использовал флаг оптимизации O3.
РЕДАКТИРОВАТЬ: Код первоначально был присвоен факториалом a
. Он был обновлен, чтобы добавить результаты, как это предлагается в комментариях. Разница в производительности все еще видна.
Прежде всего, если вы даже серьезно относитесь к этому эталону (хотя, возможно, не применимо в этом случае, так как времена довольно большие) - ваша петля делает то же самое каждый раз. Оптимизатор может просто пропустить работу и выполнить ее один раз. Попробуйте суммировать факториал и вывести результат. Во-вторых, можете ли вы опубликовать сборку? –
Я не могу воспроизвести ваши результаты (используя GCC 5.2): http://coliru.stacked-crooked.com/a/407a3aa32caaef9e – melak47
[Без constexpr] (https://drive.google.com/file/d/ 0BxcvVB8sWMHJbmxyZzNXdzRiN1U/view? Usp = sharing) – SPMP