【问题标题】:How to find out what implicit(s) are used in my scala code如何找出我的scala代码中使用了哪些隐式
【发布时间】:2018-01-01 23:51:19
【问题描述】:

问题陈述:

  • 我在多个来源/文章中读到暗示会增加 Scala 编译时间

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

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

【问题讨论】:

  • 除非你更多地导入implicits,否则你只使用Scala Predef - scala-lang.org/api/2.12.0/scala/Predef$.html 中的这些。您可以通过小心地仅导入所需的隐式来保持它们的低值。
  • @SarveshKumarSingh 根据stackoverflow.com/questions/5598085/… 它比这更复杂。这就是我追求静态代码分析的原因。
  • 没有。它不是。如果您不导入任何内容,则您的范围内只会有来自Scala.Predef._ 的隐含。除此之外,一些收集方法在本地导入一些implicits,但这些方法将受到方法范围的限制。因此,就您而言,如果您不在 Scope 中导入 implicit,您将不会处理它。此外,如果您有一个带有 def example(a: A...)(implicit x: X): Y 之类签名的函数/def,那么您将需要在您的范围内隐式使用它,或者您将不得不避免使用它。

标签: performance scala compilation static-analysis scalaz


【解决方案1】:

确实,implicits 可以降低编译速度,尤其是对于使用它们进行类型级计算的代码。衡量它们的影响绝对是值得的。不幸的是,很难追查肇事者。不过有一些工具可以提供帮助:

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

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

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

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

只需使用reify 和良好的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)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 2011-08-20
      • 2014-05-27
      • 2011-10-05
      • 2018-01-05
      相关资源
      最近更新 更多