val a = new Array[(Int, Int)](250000000)
... // initialization here
// #1
val b = a.sortBy(_._1)
// This part completely kills GC,
// and I allocate plenty of heap memory (30GB)
// more than it's trying to use
// #2
val b = a.sorted
// Kills GC as efficiently as #1
// #3
val b = a.sortWith(_._1 < _._1)
// This part doesn't kill GC, but
// takes long to complete (224s)
// and still requires 10GB of heap
// #4
val a = new Array[Long](250000000)
java.util.Arrays.sort(a)
// Alternative version
// which takes only 2.7GB
// and completes in 40 secs
を発行し、私はそれが(私はGCのためのコアの#を減らすことができます知っているが、それは問題を解決していません)ソート配列:パフォーマンスがGCを殺すことによって
全16個のコアを使用して狂ったように働いている意味さて、#3(オブジェクト、不変の操作)のオーバーヘッドがあり、5倍の時間と4倍のヒープが必要なのかどうかはわかりませんが、それは私が推測する価格です。しかし、私は#1と#2に困惑しています。私は疫病として暗黙の順序を避けるべきですか?そこには何が起こっているのですか?私はおそらくそれを間違っている?
Scalaのバージョン:2.12.4
ゼロ配列をソートしていますか? –
いいえ、ランダムな整数。 –
プリミティブは、オブジェクトよりも速く、メモリの使用量が少なくなります。タプルオブジェクトの代わりにプリミティブなLong値を使用している場合は、すべての場合でLongを使用するか、すべてでタプルを使用する方が適切です時には1つ、時にはもう1つ。 4番目の例は、配列のコピーを作成しない唯一の例です(ソートされたコピーを作成する代わりに、配列。ソートのソートが行われます)。 – puhlen