c++ - 分析模板元程序编译时间

标签 c++ profiling instantiation template-meta-programming

我正在开发一个具有大量编译时计算的 C++ 项目。长的编译时间让我们慢了下来。我如何找出模板元程序中最慢的部分以便优化它们? (当我们的运行时计算速度很慢时,我有很多分析器可供选择,例如 valgrind 的 callgrind 工具。所以我尝试构建一个调试 GCC 并对其进行分析以编译我们的代码,但我并没有从中学到很多东西那个。)

我使用 GCC 和 Clang,但欢迎提出任何建议。

我在 Boost 的网站上找到了 profile_templates,但它的文档似乎很少,并且需要 jam/bjam 构建系统。如果你展示了如何在非 Jam 项目中使用它1,我会支持你。 https://svn.boost.org/svn/boost/sandbox/tools/profile_templates/似乎可以计算实例化的数量,而计算所花费的时间是理想的。

1 我们的项目使用 CMake,并且足够小,可以接受将 Jamfile 组合在一起仅用于模板分析。

最佳答案

我知道这是一个老问题,但我想给出一个更新的答案。

有一组基于 clang 的项目可以解决这个特定问题。第一个组件是对 clang 编译器的检测,它生成对编译期间发生的所有模板实例化的完整跟踪,包括时序值和可选的内存使用计数。该工具称为 Templight,可在此处访问(当前需要针对已修补的 clang 源代码树进行编译):

https://github.com/mikael-s-persson/templight

第二个组件是一个转换工具,它允许您将 templight 跟踪转换为其他格式,例如易于解析的基于文本的格式(yaml、xml、文本等)以及更易于可视化的格式,例如graphviz/graphML,更重要的是可以加载到KCacheGrind中的callgrind输出,以可视化和检查模板实例化的元调用图及其编译时间成本,例如这个模板实例化配置文件的屏幕截图创建 boost::container::vector 并使用 std::sort:

对其进行排序的代码

enter image description here

在这里查看:

https://github.com/mikael-s-persson/templight-tools

最后,还有另一个相关项目,它创建了一个交互式 shell 和调试器,以便能够交互式地在模板实例化图上上下移动:

https://github.com/sabel83/metashell

关于c++ - 分析模板元程序编译时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15818281/

相关文章:

azure - 在 Azure 函数中启用 App Insights 探查器

javascript - 在 Linux 中分析 Node.JS(代码)执行时间

android - OpenGL ES 中的 GPU 分析和回调

C++ unique_ptr 单独声明和实例化

c++ - 定义一个结尾没有空终止字符(\0)的字符串

c++ - 在析构函数中检测事件异常

c++ - 如何在没有此运算符的情况下为类型实现默认运算符<<(ostream&, T)?

c++ - sal 缓冲区注释上的额外下划线 ( _ ) 是什么?

python - myhdl 中的模块实例化

c++ - 从右值参数推导出对 const 的引用