performance - 如何找出我的 Scala 代码中使用了哪些隐式

标签 performance scala compilation static-analysis scalaz

问题陈述:

  • 我在多个来源/文章中读到隐含会增加 Scala 编译时间
  • 我想将它们删除/减少到最低限度,看看没有它们的编译时间会是什么样子(基于 scalaz & akka & slick,代码库大约有 1000 个不同复杂性的文件)
  • 我真的不知道我可以执行什么样的静态分析。高度赞赏对现有工具的任何喜欢/引用。
  • 最佳答案

    确实,隐式会降低编译速度,尤其是对于使用它们进行类型级计算的代码。衡量它们的影响绝对值得。不幸的是,追踪罪魁祸首可能很困难。有一些工具可以提供帮助:

  • 使用 -Ystatistics:typer 运行 scalac查看在类型检查期间处理了多少树节点。例如。您可以查看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)
    

    关于performance - 如何找出我的 Scala 代码中使用了哪些隐式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48054215/

    相关文章:

    c++ - 编译DLL时如何添加include

    mysql - Mysql中简单查询速度慢

    scala - 给定 A::B::C 和 (A, B, C) => D,如何写 A::B::C => D?

    scala - 覆盖可堆叠特征模式中的抽象类型成员

    scala - 在 Scala 中将函数参数定义为 "var"?

    xcode - 远程运行 Xcode 构建并获取结果以在本地运行项目或显示构建问题

    perl - 是否有关于 Perl 5.10.0 中的性能回归有多糟糕的基准?

    sql - 更新表中所有行的有效方法

    java - 加快图像下载时间

    perl - 为什么这个 Perl BEGIN block 在调试器中的行为不同?