【发布时间】:2019-03-04 19:38:49
【问题描述】:
我有一些非平凡的 C++17 函数标记为 constexpr。他们正在做与图相关的计算(深度优先遍历)和通用算法(例如,查找、排序、唯一...)。
如果我尝试通过将结果放入 constexpr 全局变量中来强制在编译时进行评估,可能会发生 3 件事:
- 对于小型计算(给出一个想法,可以说大约 100 个节点的图,节点或多或少是整数)编译很好(大约需要 2 秒)
- 对于大约 500 个节点,编译需要大约 1 分钟并占用 30GB 内存 (!)。
- 对于大约 1000 个节点,编译需要太多内存,我无法完成。
如果我删除 constexpr 限定符并要求运行时计算,编译和执行会非常快(不到 5 秒)
我使用带有 -O3 -std=c++17 的 g++ 8.2。
为什么要花这么长时间? g++ 是否以 constexpr 的编译时优化问题而闻名?
在编译过程中,constexpr 函数的性能应该如何?据我了解,编译器将自己变成了constexpr 计算的解释器。但我绝对不怀疑,在 Python 中评估相同的程序会非常快,因为数据量非常小。
编辑:提到了这些问题here(GCC 开发人员的博客)
【问题讨论】:
-
就是这样。如果您对编译器性能不满意,可以退回以获得全额退款。但请记住,正确处理 constexpr 函数是非常非常非常重要的任务。
-
@SergeyA 所以你不会争论 constexpr 计算只适用于琐碎任务的观点吗?看起来就是这样,但并不是我被介绍给 constexpr...
-
@Bérenger constrexpr 评估确实是一项艰巨的任务,编译器必须检查并禁止任何未定义的行为,并且必须输出诊断信息。
-
@GuillaumeRacicot 令我惊讶的是,我观察到的内容与关于 constexpr 的说法之间存在差异。例如,是否有关于人们报告 constexpr 计算有多慢的文档?
-
@Bérenger 我相信有一些记录在案的情况是内存使用(或计算时间)超过预期,但这些是特定于某些编译器版本/报告的问题。我建议您尝试使用不同的编译器进行试验,看看是否有人设法使您的案例更快或更轻松,并为您的实现提供详细的报告。
标签: c++ g++ c++14 constexpr compilation-time