2015-11-26 2 views
-2

Я пытаюсь оценить разницу в производительности, используя 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. Он был обновлен, чтобы добавить результаты, как это предлагается в комментариях. Разница в производительности все еще видна.

+0

Прежде всего, если вы даже серьезно относитесь к этому эталону (хотя, возможно, не применимо в этом случае, так как времена довольно большие) - ваша петля делает то же самое каждый раз. Оптимизатор может просто пропустить работу и выполнить ее один раз. Попробуйте суммировать факториал и вывести результат. Во-вторых, можете ли вы опубликовать сборку? –

+0

Я не могу воспроизвести ваши результаты (используя GCC 5.2): http://coliru.stacked-crooked.com/a/407a3aa32caaef9e – melak47

+0

[Без constexpr] (https://drive.google.com/file/d/ 0BxcvVB8sWMHJbmxyZzNXdzRiN1U/view? Usp = sharing) – SPMP

ответ

1

constexpr выгодно, когда вычисление выполняется во время компиляции. Однако компиляторы не обязаны это делать, если вы этого не требуете, например, путем создания aconstexpr. Во время выполнения constexpr не имеет значения для функции.

Я получаю очень близкие результаты в своих тестах (дельта ~ 0,1 с), как и ожидалось.