使用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编译问题?我该如何调查呢?
答案 0 :(得分:3)
在第一个(快速)实现中,只有在第一个布尔表达式求值为Levenshtein.distance
时才需要调用true
。如果Haversine.distance > 5.0
,则无需评估其余部分,这与&&
的语义相匹配。在另一个(慢)实现中,语句的顺序要求两个调用都发生,无论d <= 5.0
是否成立。