代码之家  ›  专栏  ›  技术社区  ›  mitchus

如何研究逻辑等效Scala函数之间的性能差异?

  •  1
  • mitchus  · 技术社区  · 7 年前

    使用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 回复  |  直到 7 年前
        1
  •  3
  •   C-Otto    7 年前

    在第一个(fast)实现中,调用 Levenshtein.distance 仅当第一个布尔表达式的计算结果为 true . 如果 Haversine.distance > 5.0 无需评估其余部分,这与 && . 在另一个(较慢)实现中,语句的顺序要求两个调用都发生,无论 d <= 5.0 持有。