scala.collections.mutable.ArrayBuilder と scala.collections.mutable.ArrayBuffer の違いは何ですか? たとえば、Array[Int] を作成する必要がある場合、どちらを使用するのが望ましいでしょうか? java.lang.StringBuffer と java.lang.StringBuilder のように、パフォーマンスに違いはありますか?
2 に答える
ArrayBuilder
は でありBuilder
、ビルダーは、要素を追加することによって他のコレクションを構築するために使用されることを意図しています。ビルダーは通常、クライアント コードで直接使用することを意図したものではありません。
ArrayBuffer
Buffer
および-- バッファは、Seq
要素を効率的に追加できるシーケンスです。シーケンスには多くの補助操作が付属しています。
おそらく必要ですArrayBuffer
。ArrayList
これは、Javaの の代替として使用するためのものです。このクラスは、要素を追加し、最後に配列を取得するためだけに装備されているものとは異なり、 、、、および友人のArrayBuffer
ようなすべてのバルク データ操作を備えた完全に強化されたシーケンス コレクションです。foreach
map
filter
zip
ArrayBuilder
+=
result
を好む可能性のある場所の 1 つArrayBuilder
は、プリミティブ型のようにインスタンス化し、Int
パフォーマンスを気にする場合です。この場合、ArrayBuilder
バリアントはさまざまなプリミティブ型に特化されており、適切なプリミティブ型の基になる配列を保持しますが、 はArrayBuffer
常にその下にオブジェクト配列を保持します。追加するすべてのプリミティブはボックス化されます。
配列バッファをインスタンス化するには:
new ArrayBuffer[Int] // gives you an array buffer that will hold boxed integers
配列ビルダーをインスタンス化するには:
new ArrayBuilder.ofInt // gives you a manually specialized array builder that will hold real primitives
私はそれを計り、配列を構築するArrayBuilder
方が著しく高速です:
とArrayBuffer
:
real 0m40.348s
user 0m29.544s
sys 0m1.017s
とArray Builder
:
real 0m8.392s
user 0m4.769s
sys 0m0.330s
私のコード:
import scala.collection.mutable.{ArrayBuffer, ArrayBuilder}
object MyObject {
def main(args: Array[String]) {
for (i <- 0 until 100) {
arrayBuilderMade
// or arrayBufferMade
}
}
def arrayBufferMade {
var aBuffer = new ArrayBuffer[Int]()
for (i <- 0 until 1000000) {
aBuffer += i
}
println(aBuffer.toArray.length)
}
def arrayBuilderMade {
var aBuilder = new ArrayBuilder.ofInt
for (i <- 0 until 1000000) {
aBuilder += i
}
println(aBuilder.result.length)
}
}
と
time scala my_code.scala