D 编译器分析

D compiler profiling

如何找出我的d代码的哪一部分编译时间很长?

我尝试使用 valgrind,但方法名称不是很有见地。 87% 的时间花在 <cycle 7>,40% 的时间花在 _D4ddmd5lexer5Lexer4scanMFPS4ddmd6tokens5TokenZv

我正在寻找这样的东西:40% 的时间花在 xy.d 上,其中 80% 的时间花在编译模板 xyz 的各种实例化上,这是一个原因是因为它使用了 memcpy 99% 的时间。

我有兴趣分析 DMD 和 LDC。

由于 D 编译器前端是用 D 编写的,与 C++ 等工具相比,使用传统工具进行分析会相当困难。我在 Linux 上使用 gdb 和 valgrind 等工具以及在 Windows 上使用 VisualD 等工具取得了一些成功,Mac 用户有点 SOL。

您还有五个其他选择:

  1. 停止尝试在编译器中查找特定函数并转向有关问题的常识(见下文)
  2. 使用 https://github.com/CyberShadow/DBuildStat 这样的工具。它不会给你你所询问的确切答案,但如果你想让一个大型项目编译得更快,那总比没有好。
  3. 使用 -v 标志尝试查看程序的哪些部分需要一段时间。当然,这是一种非常蛮力的方法,可能会花费您一段时间。
  4. 修改 DMD 前端的 makefile 以使用 -profile 开关。每次你 运行 DMD 你都会得到一个包含很多信息的配置文件。当然,我认为这从未被尝试过。您的里程可能会有所不同。
  5. 尝试在他们的 Github 问题页面上询问 LDC 团队。 IIRC 他们制作了一个用于分析的补丁版本,用于 Weka.io 代码库。

当我说 turn to common knowledge 时,我的意思是说你的编译速度慢很可能是由于一些常见问题。例如,当 SQL 查询花费的时间太长时,我的第一反应是不会尝试分析 MySQL 服务器代码。以下是几个最常见的问题

  1. CTFE 虽然可以加快您的 运行 时间,但 很慢 。特别是如果你正在做像 allSatisfy 这样的递归模板或者你使用像 ctRegex 这样的函数。如果您正在执行繁重的 CTFE,并且希望以可能较慢的代码为代价进行更快的编译,请考虑将它们切换为 运行 时间调用。
  2. DMD(还)不会忽略程序中未使用的符号,这意味着如果您导入模块,模块中的所有函数都会发生代码生成。即使对于选择性进口也是如此。如果您不使用它们,链接器将从生成的可执行文件中 p运行e 函数,但编译器仍然需要时间来编译它们。避免像 import std.algorithm;import std.range; 这样的导入。而是使用特定于包的导入,例如 import std.algorithm.iteration : map;.