14

私はミュータブルを使用してBufferおり、それが持つ要素の数を調べる必要があります。

sizeとメソッドの両方lengthが定義され、別々の特性から継承されます。

実際のパフォーマンスの違いはありますか、それとも正確な同義語と見なすことができますか?

4

4 に答える 4

16

これらは同義語であり、ほとんどの場合、sizeコレクションとlengthforArrayとを持つというJavaの決定の結果ですString。一方は常にもう一方の観点から定義され、ソースコードを見ると、どちらがどちらであるかを簡単に確認できます。リンクはscaladocで提供されています。def size定義する特性を見つけ、ソースコードを開いて、またはを検索するだけですdef length

于 2013-02-06T17:01:38.113 に答える
5

この場合、それらは同義語と見なすことができます。次のような他の場合にも注意する必要がありますArray-長さとサイズは常に同じ結果を返しますが、Scala 2.10より前のバージョンでは、呼び出しにボクシングのオーバーヘッドが発生する可能性がありますsize(これは配列の周りのScalaラッパーによって提供されます) 、一方length 、基盤となるJava配列によって提供されます。

Scala 2.10では、メソッドを提供する値クラスを使用することでこのオーバーヘッドが取り除かれているsizeため、好きなメソッドを自由に使用できます。

于 2013-02-06T16:42:09.577 に答える
4

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倍以上遅くなります。

なぜそれが起こるのですか?私はそれを掘り下げませんでした、私は知りません。ただし、パフォーマンスが大幅に異なるシナリオがあります。lengthsize

于 2017-02-16T14:11:06.057 に答える
3

Buffer.size州のスカラドックとして、これらは同義語です。

このバッファのサイズ。長さに相当します。

のscaladocBuffer.lengthも明示的です:

バッファの長さ。注:xs.lengthとxs.sizeは同じ結果になります。

簡単なアドバイス:質問する前にscaladocを参照してください。

更新:あなたの編集がパフォーマンスの言及を追加しているのを見たところです。Daniel C. Sobralの支援として、通常、一方は常に他方の観点から実装されるため、同じパフォーマンスが得られます。

于 2013-02-06T16:31:20.253 に答える