В чем разница между scala.collections.mutable.ArrayBuilder и scala.collections.mutable.ArrayBuffer? Если, например, мне нужно построить массив [Int], который предпочтительнее использовать? Есть ли разница в производительности, например, в java.lang.StringBuffer и java.lang.StringBuilder?
ArrayBuffer vs ArrayBuilder в scala
Ответ 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