如何找出我的 Scala 代码中使用了哪些隐式
How to find out what implicit(s) are used in my scala code
问题陈述:
我读了多个 sources/articles 暗示会增加 scala 编译时间
我想remove/reduce它们尽可能少,看看没有它们的编译时间会是什么样子(代码库大约有 1000 个基于 scalaz & akka & slick 的各种复杂文件)
我真的不知道我能进行什么样的静态分析。任何 liks/references 对现有工具的高度赞赏。
确实,隐式 可以 降低编译速度,尤其是对于使用它们进行类型级计算的代码。衡量它们的影响绝对是值得的。不幸的是,追踪罪魁祸首可能很困难。不过,有些工具可以提供帮助:
运行 scalac with -Ystatistics:typer
查看在类型检查期间处理了多少树节点。例如。您可以检查 ApplyToImplicitArgs
和 ApplyImplicitView
相对于总数的数量(并可能将其与另一个代码库进行比较)。
Scala 中心目前正在努力改善 scalacenter/scalac-profiling 托管的现状。它包括一个 sbt 插件,应该能够让您了解隐式搜索时间,但它仍处于起步阶段(在撰写本文时尚未发布)。我还没有亲自测试过,但你仍然可以尝试一下。
您还可以使用 -Xlog-implicits
进行编译,将输出通过管道传输到文件并分析日志。它将为每个被考虑但失败的隐式候选者显示一条消息,包括源位置、搜索类型和失败原因。这种失败的搜索代价高昂。您可以使用您最喜欢的脚本语言(为什么不是 Scala?)编写一个简单的脚本来总结数据,甚至用一些漂亮的图形绘制它。
旁白:如何解析特定的隐式实例?
只需使用 reify
和好的 ol' 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)
scala 中心现在正在进行 scalac 分析:https://scalacenter.github.io/scalac-profiling/
问题陈述:
我读了多个 sources/articles 暗示会增加 scala 编译时间
我想remove/reduce它们尽可能少,看看没有它们的编译时间会是什么样子(代码库大约有 1000 个基于 scalaz & akka & slick 的各种复杂文件)
我真的不知道我能进行什么样的静态分析。任何 liks/references 对现有工具的高度赞赏。
确实,隐式 可以 降低编译速度,尤其是对于使用它们进行类型级计算的代码。衡量它们的影响绝对是值得的。不幸的是,追踪罪魁祸首可能很困难。不过,有些工具可以提供帮助:
运行 scalac with
-Ystatistics:typer
查看在类型检查期间处理了多少树节点。例如。您可以检查ApplyToImplicitArgs
和ApplyImplicitView
相对于总数的数量(并可能将其与另一个代码库进行比较)。Scala 中心目前正在努力改善 scalacenter/scalac-profiling 托管的现状。它包括一个 sbt 插件,应该能够让您了解隐式搜索时间,但它仍处于起步阶段(在撰写本文时尚未发布)。我还没有亲自测试过,但你仍然可以尝试一下。
您还可以使用
-Xlog-implicits
进行编译,将输出通过管道传输到文件并分析日志。它将为每个被考虑但失败的隐式候选者显示一条消息,包括源位置、搜索类型和失败原因。这种失败的搜索代价高昂。您可以使用您最喜欢的脚本语言(为什么不是 Scala?)编写一个简单的脚本来总结数据,甚至用一些漂亮的图形绘制它。
旁白:如何解析特定的隐式实例?
只需使用 reify
和好的 ol' 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)
scala 中心现在正在进行 scalac 分析:https://scalacenter.github.io/scalac-profiling/