在scala-user邮件列表里看到的,有人说他有两个类用scalac编译非常慢,别人给出了一个工具可以诊断scalac的编译过程在各环节耗时情况,这个工具是基于aspectj的,尝试了一把。
先下载aspectj,然后用java -jar aspectj-1.8.2.jar
安装,它是个图形界面的安装程序,过程就是文件解压到指定路径。
然后设置一下环节变量:
$ export ASPECTJ_HOME=/data/tools/aspectj/1.8
$ export PATH=${ASPECTJ_HOME}/bin:${PATH}
从github上clone一份scalac-aspects,然后运行一下样例:
$ ./scalac-aspects PerUnitTiming.aj Foo.scala
...
Per-file timings (all times are in micro seconds)
Foo.scala 1260255
parser 170939
namer 144580
packageobjects 60
typer 223685
patmat 10843
superaccessors 7899
extmethods 4354
pickler 35800
refchecks 78355
selectiveanf 2013
selectivecps 1724
uncurry 26039
tailcalls 16333
specialize 59948
explicitouter 86753
erasure 236839
posterasure 855
lazyvals 11423
lambdalift 38314
constructors 43564
flatten 466
mixin 20772
cleanup 10301
icode 27698
inliner 626
inlineExceptionHandlers 28
closelim 26
dce 18
对这个简单的只定义了一个方法的Foo.scala
,编译过程最耗时也是在typer
和erasure
阶段,估计大部分代码的编译过程类型相关的处理都会占大头。
《scala的诊断方法(5) 用scalac-aspects诊断scalac各阶段耗时》上有1个想法