我遇到了Scala和Java版本之間幾乎相同的性能差異。我看到Java版本比Scala版本快68%。任何想法爲什麼發生這種情況?Scala vs Java性能(HashSet和bigram代)
Java版本:
public class Util {
public static Set <String> toBigramsJava(String s1) {
Set <String> nx = new HashSet <String>();
for (int i = 0; i < s1.length() - 1; i++) {
char x1 = s1.charAt(i);
char x2 = s1.charAt(i + 1);
String tmp = "" + x1 + x2;
nx.add(tmp);
}
return nx;
}
}
斯卡拉版本:
object Util {
def toBigramsScala(str: String): scala.collection.mutable.Set[String] = {
val hash: scala.collection.mutable.Set[String] = scala.collection.mutable.HashSet[String]()
for (i <-0 to str.length - 2) {
val x1 = str.charAt(i)
val x2 = str.charAt(i + 1)
val tmp = "" + x1 + x2
hash.add(tmp)
}
return hash
}
}
測試結果:
scala> Util.time(for(i<-1 to 1000000) {Util.toBigramsScala("test test abc de")}) 17:00:05.034 [info] Something took: 1985ms
Util.time(for(i<-1 to 1000000) {Util.toBigramsJava("test test abc de")}) 17:01:51.597 [info] Something took: 623ms
系統:
我跑這在Ubuntu 14.04,與4個核心和8Gig RAM。 Java版本1.7.0_45,Scala版本2.10.2。
還有一些關於我的blog的更多信息。
雖然這不是問題,但您可以將其修改爲一組匹配的問題和答案。 – 2014-08-31 21:31:47
我建議你看一下字節碼來看看區別。 – 2014-08-31 21:34:56
難道這是對Scala中不存在的Java'for'循環的優化嗎,因爲它們在Scala中有一些特殊性?這兩種方法看起來非常相似。另外,如果用java.util.HashSet替換scala.collection.mutable.HashSet會發生什麼? – Dici 2014-08-31 21:40:46