c++ - constexpr 说明符性能没有达到我在 C++ 中的期望
问题描述
我刚刚了解到 constexpr 说明符函数可以在编译过程中运行,我尝试在 VS 2017 中使用 Debug x86 Mode 检查实际性能,结果显示它们之间存在微小的时间差异。它仍然经过了很多时间,而不是“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;
}
解决方案
您的constexpr
函数需要在编译器中进行太多计算,这就是编译器选择将其延迟到运行时执行的原因。
您可以更改此行:
static const auto c_x = c_fun(40);
至:
constexpr auto c_x = c_fun(40);
查看编译器的输出。在铿锵声中,它告诉我:
note: constexpr evaluation hit maximum step limit;
c_x
确实是一个编译时常量,但由于实现限制,编译器无法计算它。请注意,您的函数具有指数复杂性。
如果您将 40 更改为某个合理的数字(例如 10),一切都会好起来的:
constexpr auto c_x = c_fun(10);
推荐阅读
- java - 使用 Spring Boot 的 Swing 应用程序
- jquery - 选择除 div 之外的所有元素不适用于 jQuery
- ios - 调用 setWorldOrigin 时子节点不可见?
- java - 测试生产缺乏良好平等的第三方对象的工厂/建造者的最佳方法是什么?
- r - 使用 httr:GET 将 API 中的数据绘制到 tibble
- angular - 在同一个组件中重复 html
- python - 从 IMDB id 列表下载电影海报
- c++ - 当键不唯一时解析键、值对
- oracle - 如何解决 Entity Framework 中的 Oracle DBLinks 限制?
- regex - API 测试正文中的正则表达式