私はScalaに慣れていません。IndexedSeqから大きなマップを作成しようとしています。機能的なスタイルマップの作成は、命令型のJavaのものよりもはるかに遅いという言葉が見つかりました。これまでのところ、私は、Scalaの機能スタイルコードだけではなく、遅くても命令的であることを知っていました。何が間違っているのですか、なぜ私のScalaコードが数倍遅くなっていますか?私の自宅のコンピュータ上で、それは220ミリ秒で実行されます。(Javaの)と460ミリ秒。(スカラ)Scalaの必須スタイルのマップ作成スニペットがJavaのスニペットより遅いのはなぜですか?
Scalaのversion
private val testSize: Int = 1000000
val seq: IndexedSeq[Int] = for (i <- 0 until testSize) yield Random.nextInt()
val warmupMapt0 = System.nanoTime()
var warmupMap: mutable.HashMap[Int, Int] = new mutable.HashMap[Int, Int]
warmupMap.sizeHint(testSize)
for (i <- 0 until testSize) warmupMap.put(i, seq(i))
val t0 = System.nanoTime()
var map: mutable.HashMap[Int, Int] = new mutable.HashMap[Int, Int]
map.sizeHint(testSize)
for (i <- 0 until testSize) map.put(i, seq(i))
println((System.nanoTime() - t0)/ 1000000 + " ms.")
のJava version
private static final int TEST_SIZE = 1_000_000;
public static void main(String[] args) {
int[] ar = new int[TEST_SIZE];
Random random = new Random();
for (int i = 0; i < TEST_SIZE; i++) {
ar[i] = random.nextInt();
}
Map<Integer, Integer> warmupMap = new HashMap<>(TEST_SIZE);
for (int i = 0; i < TEST_SIZE; i++) {
warmupMap.put(i, ar[i]);
}
Map<Integer, Integer> map = new HashMap<>(TEST_SIZE);
long t0 = System.nanoTime();
for (int i = 0; i < TEST_SIZE; i++) {
map.put(i, ar[i]);
}
System.out.println((System.nanoTime() - t0)/1_000_000 + " ms.");
}
これはあなたを助けるかもしれないhttp://stackoverflow.com/questions/9799085/scala-perf-why-is-this-scala-app-30x-slower-than-the-equivalent-java-app?rq=1 –
@ Jean-BaptisteYunèsええ、私はそれを見ました。なぜワープアップの前にval warmupMapt0 = System.nanoTime()を追加して、コンソールから実行しようとしましたが、それは助けになりませんでした。 – MaxNevermind
タイミング結果を追加できますか? – maasg