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

分析模板元程序编译时间 我正在研究一个C++项目,它有大量的编译时间计算。编译时间太长了,我们的速度变慢了。如何找出模板元程序中最慢的部分,以便优化它们?(当我们运行时计算速度较慢时,我有很多分析器可供选择,例如valgrind的callgrind工具。因此我尝试构建一个调试GCC并对其进行评测以编译代码,但我没有从中学到很多东西。),c++,profiling,instantiation,template-meta-programming,C++,Profiling,Instantiation,Template Meta Programming,我使用GCC和Clang,但欢迎您提出任何建议 我在Boost的网站上找到了profile\u模板,但它的文档似乎很少,需要jam/bjam构建系统。如果您演示如何在非干扰项目1上使用它,我将投票支持您。似乎可以计算实例化的数量,而计算所用的时间则比较理想 1我们的项目使用CMake,并且足够小,可以接受仅为模板分析而将Jamfile拼凑在一起。可能是您感兴趣的事情。对于模板化实体,它显示了每个实例化所花费的时间。其他数据包括每个函数被调用的次数、每个函数调用了多少个分析过的函数以及每次调用的平

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

我在Boost的网站上找到了
profile\u模板
,但它的文档似乎很少,需要jam/bjam构建系统。如果您演示如何在非干扰项目1上使用它,我将投票支持您。似乎可以计算实例化的数量,而计算所用的时间则比较理想

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

可能是您感兴趣的事情。对于模板化实体,它显示了每个实例化所花费的时间。其他数据包括每个函数被调用的次数、每个函数调用了多少个分析过的函数以及每次调用的平均包含时间。这本经典的书附带了一个关于分析编译时成本的20页附录。它有一张附带的CD,里面有生成附录中图形的代码

另一篇论文是,也许这对你有用


还有另一种方法,但更劳动密集,就是从编译器输出中计算每个类的数量。

我从2008年开始就在一个大量使用模板元编程的库上工作。真正需要更好的工具或方法来理解什么消耗了最多的编译时间

我所知道的唯一一种技术是分而治之的方法,将代码分成不同的文件,注释出模板定义的主体,或者将模板实例化包装在#define宏中,暂时重新定义这些宏,使其不起任何作用。然后,您可以重新编译包含和不包含各种实例化的项目,并缩小范围

顺便说一句,将同一代码拆分成更多更小的文件可能会使其编译更快。我说的不仅仅是并行编译的机会——即使是串行编译,我观察到它仍然更快。在编译库和编译Boost Spirit解析器时,我都在gcc中观察到了这种效果。我的理论是,gcc中的一些符号解析、重载解析、SFINAE或类型推断代码相对于执行单元中使用的类型定义或符号的数量具有O(n logn)甚至O(n^2)的复杂性


最终,您需要仔细检查模板,将真正依赖于类型信息的内容与不依赖于类型信息的内容区分开来,并尽可能在代码中不需要模板类型的部分使用类型擦除和虚拟函数。如果可以移动部分代码,则需要将内容从标题中取出并放入cpp文件中。在一个完美的世界里,编译器应该能够自己解决这个问题——你不必手动移动代码来照看它——但这是我们今天拥有的编译器的最新技术。

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

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

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

在这里查看:

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


据我所知,它只计算运行时每个实例化花费的时间。这不是OP想要的。相关问题:这是模板元编程有史以来最棒的事情……我不再需要猜测到底发生了什么……我真的可以看到它@尽管templight工具看起来有点过时,但有没有整合cmake 3的计划?