Подтвердить что ты не робот

ArrayBuffer vs ArrayBuilder в scala

В чем разница между scala.collections.mutable.ArrayBuilder и scala.collections.mutable.ArrayBuffer? Если, например, мне нужно построить массив [Int], который предпочтительнее использовать? Есть ли разница в производительности, например, в java.lang.StringBuffer и java.lang.StringBuilder?

4b9b3361

Ответ 1

ArrayBuilder - это Builder, и строители предназначены для использования для создания других коллекций путем добавления к ним элементов. Строители обычно не предназначены для непосредственного использования в клиентском коде.

ArrayBuffer - это Buffer и Seq - буферы - это последовательности, к которым вы можете эффективно добавлять элементы. Последовательности поставляются с большим количеством вспомогательных операций.

Вероятно, вам понадобится ArrayBuffer. Он предназначен для использования в качестве альтернативы ArrayList в Java. Класс ArrayBuffer представляет собой полнофункциональные коллекции последовательностей со всеми операциями объемных данных, такими как foreach, map, filter, zip и друзьями, в отличие от ArrayBuilder, который оснащен только += до добавьте элементы и result, чтобы получить массив в конце.

Одно место, где вы можете предпочесть 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

Ответ 2

Я приурочил это время и построил массив с 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