私は変更可能なBuffer
を使用していますが、いくつの要素があるか調べる必要があります。Scala Buffer:サイズまたは長さ?
size
およびlength
の方法は、別々の形質から継承して定義されている。
実際のパフォーマンスの違いはありますか、それとも正確な同義語と考えることができますか?
私は変更可能なBuffer
を使用していますが、いくつの要素があるか調べる必要があります。Scala Buffer:サイズまたは長さ?
size
およびlength
の方法は、別々の形質から継承して定義されている。
実際のパフォーマンスの違いはありますか、それとも正確な同義語と考えることができますか?
彼らは同義語、Array
とString
のためのコレクションのためのsize
とlength
を持つJavaの決定のほとんどは結果です。 1つは常に他のものの観点から定義され、ソースコードを見ることでどちらが見えるかを簡単に知ることができます。そのソースコードはscaladocで提供されています。定義する特性を見つけて、ソースコードを開き、def size
またはdef length
を検索してください。
ありがとう!私は、ソースコードがスカラドックを通じてオンラインでアクセス可能であるかどうかはわかりませんでした。これはかなりいいです! – Eduardo
彼らはBuffer.size
状態のscaladocとして同義語である:
長さに相当このバッファのサイズ、。
scaladoc Buffer.length
はあまりにも明示的である:
バッファの長さ。注:xs.lengthとxs.sizeは同じ結果を返します。
簡単なアドバイス:質問をする前にscaladocを参照してください。
更新日:あなたの編集を見て、パフォーマンスの言及を追加しました。 Daniel C. Sobralの援助のように、通常は常に他のものの期間に実装されるため、同じ性能を持ちます。
この場合、それらは同義語と見なすことができます。 Array
のような他のケースに注意してください。長さとサイズは常に同じ結果を返しますが、Scala 2.10より前のバージョンでは、size
(Scalaラッパーによって提供されています。配列)、length
は基底のJava配列によって提供されます。
Scala 2.10では、size
メソッドを提供する値クラスを使用してこのオーバーヘッドが削除されていますので、好きな方法で自由に使用することができます。
私はScala 2.11コードのプロファイリングを行い、配列上で 'size'を呼び出すとオブジェクトが作成されます。パフォーマンス重視のコードでは、これを回避する必要があります。 – mattg
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倍遅い以上です。
どうしてですか?私はそれを掘り起こさなかった、私は知らない。しかし、length
とsize
が大幅に異なるシナリオがあります。
私は個人的に意味のあるニックピッカーなので、線形または逐次であれば 'length'しか使用しません。そうでなければ' size'を使います。 –