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

scala的诊断方法(5) 用scalac-aspects诊断scalac各阶段耗时》上有1个想法

  1. Per-file timings (all times are in micro seconds)
    Foo.scala 942744
    	parser                    112563
    	namer                     112932
    	packageobjects            62
    	typer                     101549
    	patmat                    16444
    	superaccessors            5527
    	extmethods                1360
    	pickler                   19533
    	refchecks                 56686
    	uncurry                   13303
    	fields                    21388
    	tailcalls                 11173
    	specialize                16592
    	explicitouter             7251
    	erasure                   59748
    	posterasure               4687
    	lambdalift                17774
    	constructors              52464
    	flatten                   538
    	mixin                     9202
    	cleanup                   6455
    	delambdafy                3183
    	jvm                       292330
    
    $ ajc -version
    AspectJ Compiler 1.9.5
    
    $ scala -version
    Scala code runner version 2.12.8
    
    $ java -version
    java version "1.8.0_211"
    

发表评论

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