私はミュータブルを使用してBuffer
おり、それが持つ要素の数を調べる必要があります。
size
とメソッドの両方length
が定義され、別々の特性から継承されます。
実際のパフォーマンスの違いはありますか、それとも正確な同義語と見なすことができますか?
私はミュータブルを使用してBuffer
おり、それが持つ要素の数を調べる必要があります。
size
とメソッドの両方length
が定義され、別々の特性から継承されます。
実際のパフォーマンスの違いはありますか、それとも正確な同義語と見なすことができますか?
これらは同義語であり、ほとんどの場合、size
コレクションとlength
forArray
とを持つというJavaの決定の結果ですString
。一方は常にもう一方の観点から定義され、ソースコードを見ると、どちらがどちらであるかを簡単に確認できます。リンクはscaladocで提供されています。def size
定義する特性を見つけ、ソースコードを開いて、またはを検索するだけですdef length
。
この場合、それらは同義語と見なすことができます。次のような他の場合にも注意する必要がありますArray
-長さとサイズは常に同じ結果を返しますが、Scala 2.10より前のバージョンでは、呼び出しにボクシングのオーバーヘッドが発生する可能性がありますsize
(これは配列の周りのScalaラッパーによって提供されます) 、一方length
、基盤となるJava配列によって提供されます。
Scala 2.10では、メソッドを提供する値クラスを使用することでこのオーバーヘッドが取り除かれているsize
ため、好きなメソッドを自由に使用できます。
Scala-2.11以降、これらのメソッドのパフォーマンスは異なる場合があります。たとえば、次のコードについて考えてみます。
val bigArray = Array.fill(1000000)(0)
val beginTime = System.nanoTime()
var i = 0
while (i < 2000000000) {
i += 1
bigArray.length
}
val endTime = System.nanoTime()
println(endTime - beginTime)
sys.exit(-1)
これをamd64コンピューターで実行すると、約2423834ナノ秒の時間が得られます(時々異なります)。
さて、length
方法をに変更size
すると、約70764719ナノ秒の時間になります。
これは20倍以上遅くなります。
なぜそれが起こるのですか?私はそれを掘り下げませんでした、私は知りません。ただし、パフォーマンスが大幅に異なるシナリオがあります。length
size
Buffer.size
州のスカラドックとして、これらは同義語です。
このバッファのサイズ。長さに相当します。
のscaladocBuffer.length
も明示的です:
バッファの長さ。注:xs.lengthとxs.sizeは同じ結果になります。
簡単なアドバイス:質問する前にscaladocを参照してください。
更新:あなたの編集がパフォーマンスの言及を追加しているのを見たところです。Daniel C. Sobralの支援として、通常、一方は常に他方の観点から実装されるため、同じパフォーマンスが得られます。