2013-02-06 5 views
12

私は変更可能なBufferを使用していますが、いくつの要素があるか調べる必要があります。Scala Buffer:サイズまたは長さ?

sizeおよびlengthの方法は、別々の形質から継承して定義されている。

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

+2

私は個人的に意味のあるニックピッカーなので、線形または逐次であれば 'length'しか使用しません。そうでなければ' size'を使います。 –

答えて

15

彼らは同義語、ArrayStringのためのコレクションのためのsizelengthを持つJavaの決定のほとんどは結果です。 1つは常に他のものの観点から定義され、ソースコードを見ることでどちらが見えるかを簡単に知ることができます。そのソースコードはscaladocで提供されています。定義する特性を見つけて、ソースコードを開き、def sizeまたはdef lengthを検索してください。

+0

ありがとう!私は、ソースコードがスカラドックを通じてオンラインでアクセス可能であるかどうかはわかりませんでした。これはかなりいいです! – Eduardo

2

彼らはBuffer.size状態のscaladocとして同義語である:

長さに相当このバッファのサイズ、。

scaladoc Buffer.lengthはあまりにも明示的である:

バッファの長さ。注:xs.lengthとxs.sizeは同じ結果を返します。

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

更新日:あなたの編集を見て、パフォーマンスの言及を追加しました。 Daniel C. Sobralの援助のように、通常は常に他のものの期間に実装されるため、同じ性能を持ちます。

+0

パフォーマンスの違いがあったのかどうか疑問に思っていましたか?たとえば、データ構造に実際の属性として格納されているものと、同じ値を返すためにListを使用してすべての値をループしなければならないものがあります。 – Eduardo

+0

私の質問をより明示的に編集しました – Eduardo

5

この場合、それらは同義語と見なすことができます。 Arrayのような他のケースに注意してください。長さとサイズは常に同じ結果を返しますが、Scala 2.10より前のバージョンでは、size(Scalaラッパーによって提供されています。配列)、lengthは基底のJava配列によって提供されます。

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

+0

私はScala 2.11コードのプロファイリングを行い、配列上で 'size'を呼び出すとオブジェクトが作成されます。パフォーマンス重視のコードでは、これを回避する必要があります。 – mattg

2

Scala-2.11以降、これらのメソッドのパフォーマンスが異なります。およそ2423834 nanos値の時間を与えます(随時異なります)私のAMD64コンピュータ上でこれを実行する

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) 

:たとえば、このコードを検討してください。

lengthメソッドをsizeに変更すると、約70764719ナノ秒になります。

20倍遅い以上です。

どうしてですか?私はそれを掘り起こさなかった、私は知らない。しかし、lengthsizeが大幅に異なるシナリオがあります。

関連する問題