並列処理すると1つの処理が重くなる
並列で実行すると、1つの処理が重くなってしまいます。
$ scala
Welcome to Scala version 2.11.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_25).
Type in expressions to have them evaluated.
Type :help for more information.
// 処理時間を計測する関数
scala> def elapsed(f: => Unit) = { val s = new java.util.Date; f; println("time: " + (new java.util.Date().getTime - s.getTime) + "ms") }
elapsed: (f: => Unit)Unit
// 何か重い処理
scala> def f = (1 to 1000000).map(_ + scala.util.Random.nextInt(10000))
f: scala.collection.immutable.IndexedSeq[Int]
// 普通に30回重い処理を実行
scala> (1 to 30).foreach { _ => elapsed(f) }
time: 166ms
time: 84ms
time: 36ms
time: 35ms
time: 64ms
time: 55ms
time: 52ms
time: 55ms
time: 54ms
time: 54ms
time: 58ms
time: 54ms
time: 52ms
time: 53ms
time: 51ms
time: 56ms
time: 57ms
time: 52ms
time: 63ms
time: 56ms
time: 54ms
time: 70ms
time: 72ms
time: 55ms
time: 119ms
time: 106ms
time: 99ms
time: 86ms
time: 93ms
time: 61ms
// 今度はparで並列に実行
scala> (1 to 30).par.foreach { _ => elapsed(f) }
time: 201ms
time: 212ms
time: 215ms
time: 221ms
time: 176ms
time: 217ms
time: 226ms
time: 251ms
time: 242ms
time: 230ms
time: 235ms
time: 268ms
time: 238ms
time: 235ms
time: 235ms
time: 383ms
time: 372ms
time: 382ms
time: 396ms
time: 414ms
time: 407ms
time: 337ms
time: 324ms
time: 354ms
time: 390ms
time: 407ms
time: 452ms
time: 159ms
time: 147ms
time: 37ms
parでの例ですが、Futureでやっても同じような現象でした。
コア数は4つなので並列度は4ですが、さらに並列度を上げると比例してしてさらに重くなります。
処理時間が10倍〜とかなるので、10秒だと100秒とかになって...。
"PCって色々アプリ動かすと急に重くなるよね"みたいな当たり前の現象なのかな...と思ったりもするんですが、よく分かってません...。
何か回避策みたいなものがあるんでしょうか。
詳しい方ご教授ください。よろしくおねがいします。