32

scala.collections.mutable.ArrayBuilder と scala.collections.mutable.ArrayBuffer の違いは何ですか? たとえば、Array[Int] を作成する必要がある場合、どちらを使用するのが望ましいでしょうか? java.lang.StringBuffer と java.lang.StringBuilder のように、パフォーマンスに違いはありますか?

4

2 に答える 2

44

ArrayBuilderは でありBuilder、ビルダーは、要素を追加することによって他のコレクションを構築するために使用されることを意図しています。ビルダーは通常、クライアント コードで直接使用することを意図したものではありません。

ArrayBufferBufferおよび-- バッファは、Seq要素を効率的に追加できるシーケンスです。シーケンスには多くの補助操作が付属しています。

おそらく必要ですArrayBufferArrayListこれは、Javaの の代替として使用するためのものです。このクラスは、要素を追加し、最後に配列を取得するためだけに装備されているものとは異なり、 、、、および友人のArrayBufferようなすべてのバルク データ操作を備えた完全に強化されたシーケンス コレクションです。foreachmapfilterzipArrayBuilder+=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
于 2013-04-05T17:20:58.860 に答える
11

私はそれを計り、配列を構築する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
于 2016-12-26T15:05:29.637 に答える