производительность спецификатора constexpr не соответствует моим ожиданиям в C ++ - PullRequest
0 голосов
/ 07 октября 2018

Я только что узнал, что функция спецификатора constexpr может выполняться в процессе компиляции, я попытался проверить фактическую производительность в VS 2017 с режимом Debug x86, результат показал небольшую разницу во времени между ними.Это все еще прошло много времени, а не "0".Я сделал что-то не так, и кто-нибудь может мне помочь, большое спасибо!

#include <iostream>
#include <time.h>

size_t r_fun(size_t n) noexcept
{
    if (n == 0) return 0;
    if (n == 1) return 1;
    return r_fun(n - 1) + r_fun(n - 2);
}

constexpr size_t c_fun(size_t n) noexcept
{
    if (n == 0) return 0;
    if (n == 1) return 1;
    return c_fun(n - 1) + c_fun(n - 2);
}


int main()
{
    clock_t start, finish;

    start = clock();
    auto r_x = r_fun(40);  
    finish = clock();
    std::cout <<"result:"<< r_x<< "\ttime:" << (double)(finish - start) << std::endl;

    start = clock();
    static const auto c_x = c_fun(40);
    finish = clock();
    std::cout << "result:" << c_x << "\ttime:" << (double)(finish - start) << std::endl;

    return 0;
}

1 Ответ

0 голосов
/ 07 октября 2018

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

Вы можете изменить эту строку:

static const auto c_x = c_fun(40);

до:

constexpr auto c_x = c_fun(40);

, чтобы увидеть выходные данные компилятора.На clang он говорит мне:

note: constexpr evaluation hit maximum step limit;

c_x действительно является константой времени компиляции, но компилятор не может ее вычислить из-за ограничений реализации.Обратите внимание, что ваша функция имеет экспоненциальную сложность.

Все будет хорошо , если вы измените 40 на какое-то разумное число, например 10:

constexpr auto c_x = c_fun(10);
...