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,但这并不总是可取的.
一个非常微小的性能改进可能是通过 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))相比,我可以提高速度。
这可能只适用于有大量创建相同模板实例的单元测试的情况。
| 归档时间: |
|
| 查看次数: |
413 次 |
| 最近记录: |