使用 scastie 和 scalafiddle 来评估代码执行时间

问题描述

我试图减少一些小的scala例程的执行时间,比如字符串的连接,因为我懒得设置本地环境,我使用在线scala编译器,但发现比较结果在{ {3}} 和 scastie 带有以下代码

// routine 1
var startT1 = System.nanoTime()
(1 until 100 * 1000).foreach{ x=>
  val sb = new StringBuilder("a")
  sb.append("b").append("c").append("d").append("e").append("f")
}
println(System.nanoTime() - startT1)

// routine 2
var startT2 = System.nanoTime()
(1 until 100 * 1000).foreach{ x=>
  val arr = Array[Char]('a','b','c','d','e','f')
}
println(System.nanoTime() - startT2)

在 scalafiddle 例程 1 中更快,但在 scastie 例程 2 中更快。
我读过这篇文章 scalafiddle,所以看来 scalafiddle 实际上运行的是 JavaScript 而不是 scala。但剩下的问题是,我真的可以将 scastie 用于执行时间基准测试吗?

解决方法

简短回答 - NO 我不认为您不能依赖 任何 在线运行工具(如 scastie 和 scalafiddle)来验证性能。

因为,有 1000 多个原因导致某些基准测试显示某些操作的执行时间为 X 毫秒,其中 99% 的原因是运行环境:硬件、操作系统、CPU 架构、机器负载、使用的 Scala 编译器、使用JVM 等。例如,我们不知道在 Scatie 上运行之间的环境变化,因此您可以获得完全不同的数字并且不知道为什么,因此基准测试结果将不可靠。

如果你想得到一些结果,你至少需要依赖一个,看看 https://openjdk.java.net/projects/code-tools/jmh/ 和它的 sbt helper plugin https://github.com/ktoso/sbt-jmh 并运行已知环境。

以及发布基准测试结果 - 请发布环境详细信息,以及它在何处运行。