如何调查逻辑上等效的Scala函数之间的性能差异?

时间:2018-01-05 15:29:39

标签: scala performance jvm

使用Scala 2.12,我使用以下,相当于两个代码:

  def isSimilarFast(s1: Point, s2: Point): Boolean = {
    Haversine.distance(s1.lat, s1.lon, s2.lat, s2.lon) <= 5.0 &&
    Levenshtein.distance(s1.label, s2.label) <= 2
  }

  def isSimilarSlow(s1: Point, s2: Point): Boolean = {
    val d = Haversine.distance(s1.lat, s1.lon, s2.lat, s2.lon)
    val l = Levenshtein.distance(s1.label, s2.label)
    d <= 5.0 && l <= 2
  }

我在while循环中多次调用此函数。如果我使用isSimilarFast版本,程序将在~37秒内完成。如果我使用isSimilarSlow,则需要约175秒,即超过5倍!

这是因为针对非常小的函数的JVM优化,还是因为Scala编译问题?我该如何调查呢?

1 个答案:

答案 0 :(得分:3)

在第一个(快速)实现中,只有在第一个布尔表达式求值为Levenshtein.distance时才需要调用true。如果Haversine.distance > 5.0,则无需评估其余部分,这与&&的语义相匹配。在另一个(慢)实现中,语句的顺序要求两个调用都发生,无论d <= 5.0是否成立。