如何找出我的scala代码中使用的隐含内容

时间:2018-01-01 23:51:20

标签: performance scala compilation static-analysis scalaz

问题陈述:

  • 我在多个来源/文章中读到了暗示提高scala编译时间

  • 我想将它们删除/减少到最低限度,看看没有它们的编译时间会是什么样的(代码库是基于scalaz& akka& slick的各种复杂性的大约1000个文件)

    < / LI>
  • 我真的不知道我可以执行什么样的静态分析。对现有工具的任何赞美/引用都非常赞赏。

2 个答案:

答案 0 :(得分:3)

implicits 可以降低编译速度,尤其是对于将它们用于类型级计算的代码。衡量它们的影响绝对值得。不幸的是,追查匪徒可能很困难。有些工具可以提供帮助:

  • 使用-Ystatistics:typer运行scalac,以查看在类型检查期间处理了多少个树节点。例如。您可以检查相对于总数的ApplyToImplicitArgsApplyImplicitView的数量(也可以将其与其他代码库进行比较)。

  • Scala中心目前正努力改善scalacenter/scalac-profiling托管的现状。它包含一个sbt插件,应该能够让你了解隐式搜索时间,但它仍处于起步阶段(在撰写本文时尚未发布)。我自己还没有测试过,但你仍然可以尝试一下。

  • 您还可以使用-Xlog-implicits进行编译,将输出通过管道传输到文件并分析日志。它将为每个被认为但失败的隐式候选者显示一条消息,包括源位置,搜索类型和失败原因。这种失败的搜索是昂贵的。您可以使用自己喜欢的脚本语言编写一个简单的脚本(为什么不使用Scala?)来汇总数据,甚至用一些漂亮的图形绘制它。

旁白:如何解决特定的隐式实例?

只需使用reify和好的&#39; println调试:

import scala.collection.SortedSet
import scala.reflect.runtime.universe._
println(showCode(reify { SortedSet(1,2,3) }.tree))
// => SortedSet.apply(1, 2, 3)(Ordering.Int)

答案 1 :(得分:0)

现在scala中心正在进行scalac分析:https://scalacenter.github.io/scalac-profiling/