为什么D编译需要这么长时间?

Arl*_*len 10 d compilation

D是编译速度最快的编程语言之一,如果不是最快的话,但情况并非总是如此.unittest打开时,事情变得非常缓慢.我目前的项目有6-7个模块(~2000 LOC),每个模块都有单元测试,也包含基准测试.以下是我当前项目中的一些数字:

dmd -O -noboundscheck 需要 0m1.287s

dmd -O -release -noboundscheck 需要 0m1.382s

dmd -O -inline -noboundscheck 需要 0m1.499s

dmd -O -inline -release -noboundscheck 需要 0m3.477s

添加-unittest到上述任何一个将大大增加编译时间:

dmd -O -inline -release -noboundscheck -unittest 需要 0m21.918s

有时会崩溃DMD:

time dmd -O t1.d -inline -noboundscheck -version=Double -unittest 需要 0m2.297s Internal error: ../ztc/gdag.c 776

显然,unittest是错误的,但同时它已成为我项目的重要组成部分.我想知道减速是否正常还是正在进行的工作?我的项目正在不断发展,每一个新的单元测试都需要更长时间的编译.我知道的唯一解决方案是禁用-release-inline,但这并不总是可取的.

And*_*vić 1

一个非常微小的性能改进可能是通过 a 将模板实例化移动到模块范围,version(unittest) block例如:

auto foo(T)(T t) { return t; }

version(unittest) {
    alias foo!int fooInt;
}

unittest {
    auto x = fooInt(1);
}
Run Code Online (Sandbox Code Playgroud)

对此进行分析,~30msec如果我通过 5000 个等效的单元测试块中使用别名模板实例auto x = fooInt(1),与通过直接在每个单元测试块中实例化它auto x = foo(1)(这实际上扩展到auto x = foo!int(1))相比,我可以提高速度。

这可能只适用于有大量创建相同模板实例的单元测试的情况。