scala的诊断方法(5) 用scalac-aspects诊断scalac各阶段耗时

在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,编译过程最耗时也是在typererasure 阶段,估计大部分代码的编译过程类型相关的处理都会占大头。

发表评论

电子邮件地址不会被公开。 必填项已用*标注