scala - 我可以对我的 scala 代码做些什么,以便它编译得更快?

标签 scala compilation dependencies

我有一个大型的 scala 代码库。 (https://opensource.ncsa.illinois.edu/confluence/display/DFDL/Daffodil%3A+Open+Source+DFDL)

这就像 70K 行 scala 代码。我们在 scala 2.11.7

开发变得越来越困难,因为编译 - 编辑 - 编译 - 测试 - 调试周期对于小的更改来说太长了。

增量重新编译时间可能是一分钟,这是没有开启优化的。有时更长。那是因为没有将很多更改编辑到文件中。有时一个非常小的变化会导致大量的重新编译。

所以我的问题是:我可以通过组织代码来做些什么来缩短编译时间?

例如,将代码分解成更小的文件?这会有帮助吗?

例如,更小的图书馆?

例如,避免使用隐式? (我们很少)

例如,避免使用特征? (我们有吨)

例如,避免大量进口? (我们有很多 - 包边界在这一点上非常困惑)

或者我真的无能为力吗?

我觉得这个非常长的编译在某种程度上是由于依赖关系导致的大量重新编译,我正在考虑如何减少错误的依赖关系......但这只是一个理论

我希望其他人可以阐明我们可能会做的一些事情,这将提高增量更改的编译速度。

最佳答案

一些可能有帮助的想法 - 取决于您的案例和开发风格:

  • 使用增量编译~compile在 SBT 中或由您的 IDE 提供。
  • 使用sbt-revolver也许 JRebel 可以更快地重新加载您的应用程序。更适合网络应用程序。
  • 使用 TDD - 而不是运行和调试整个应用程序编写测试并且只运行这些测试。
  • 将您的项目分解为库/JAR。通过您的构建工具将它们用作依赖项:SBT/Maven/等。或者下一个的变体...
  • 将您的项目分解为子项目 (SBT)。如果您需要所有内容,请单独编译所需内容或根项目。增量编译仍然可用。
  • 将您的项目分解为微服务。
  • 等待 Dotty 在一定程度上解决您的问题。
  • 如果一切都失败了,不要使用使编译速度变慢的高级 Scala 特性:隐式、元编程等。
  • 不要忘记检查是否为 Scala 编译器分配了足够的内存和 CPU。我还没有尝试过,但也许您可以使用 RAM 磁盘而不是 HDD 作为您的源代码并编译工件(在 Linux 上很容易)。
  • 关于scala - 我可以对我的 scala 代码做些什么,以便它编译得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40413708/

    相关文章:

    ScalaCheck:生成任意类型的任意函数

    Scala Iterator.takeWhile 正在删除失败的元素

    typescript - vs代码不转译ts文件

    javascript - 把babel和webpack放在devDependencies还是Dependencies里面?

    java - Maven:编辑父级的 POM 依赖项(排除或更新其版本)

    scala - 使用 scala.xml.pull 提取节点及其所有子节点的最佳方法?

    web-services - 如何在 Play Framework scala ws 调用中忽略 ssl 验证

    c - 为程序员学习 C

    c - C 编译器将 "-DFOO"处理为与 "-DFOO=1"相同的事实上的标准吗?

    gradle - 不要在 Gradle 中使用来自传递依赖的更高版本的库