Wpadłem na rozbieżności w wydajności pomiędzy niemal identycznymi implementacjami wersji Scala i Java. Widzę wersję Java, która jest 68% szybsza niż wersja Scala. Masz pomysł, dlaczego tak się dzieje? WersjaWydajność Scala vs Java (HashSet i generacja 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;
}
} wersja
Scala:
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
}
}
Wyniki testów:
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
System:
wpadłem to na Ubuntu 14.04, z 4 rdzeni i 8Gig RAM. Wersja Java 1.7.0_45, Scala wersja 2.10.2.
Istnieje więcej informacji na temat mojej blog.
Nie jest to jednak pytanie ... Można je skorygować w pasującym zestawie pytań i odpowiedzi. –
Proponuję zapoznać się z kodem bajtu, aby zobaczyć różnicę. –
Czy może to być optymalizacja pętli Java 'for', która nie istnieje w Scali, ponieważ mają pewne cechy szczególne w Scali? Te dwie metody wydają się naprawdę identyczne. Co się stanie, jeśli zastąpisz scala.collection.mutable.HashSet przy pomocy java.util.HashSet? – Dici