4

sizeとの意味の違いは何sizeIsですか? 例えば、

List(1,2,3).sizeIs > 1 // true
List(1,2,3).size > 1   // true

ルイスはコメントで次のように述べています

... 2.13+では、最初のものは返す前にすべてのサイズを計算しないので、sizeIs > 1どちらを使用するよりも効率的です size > 1

サイズ比較メソッドを IterableOps に追加 #6950がそれを導入したプル リクエストのようです。

スカドックを読む

この $coll のサイズをテスト値と比較する操作を含む値クラスを返します。これらの操作は、sizeCompare(Int)

sizeIs通常よりも効率的である理由は私には明らかではありませんかsize

4

1 に答える 1

5

変化は分かる範囲で。

アイデアは、 O(1) (定数) を持たないコレクションの場合ですsize。次に、sizeIs特に小さな値(コメントの 1 など)との比較の場合に、より効率的になります。

しかし、なぜ?
すべてのサイズを計算してから比較を行うのではなく、比較sizeIsを計算するときに早期に返すことができるオブジェクトを返すため、単純です。
たとえば、コードを確認してみましょう

def sizeCompare(otherSize: Int): Int = {
  if (otherSize < 0) 1
  else {
    val known = knownSize
    if (known >= 0) Integer.compare(known, otherSize)
    else {
      var i = 0
      val it = iterator
      while (it.hasNext) {
        if (i == otherSize) return if (it.hasNext) 1 else 0 // HERE!!! - return as fast as possible.
        it.next()
        i += 1
      }
      i - otherSize
    }
  }
}

したがって、コメントの例では、非常に非常に長い3 つの要素のリストがあるとします。Listに少なくとも 1 つの要素と がsizeIs > 1あることがわかるとすぐに戻ります。したがって、他の 2 つの要素をトラバースしてサイズ 3 を計算し、比較を行うコストを節約できます。hasMore

注意: コレクションのサイズが比較値よりも大きい場合、パフォーマンスはほぼ同じになります(size各サイクルで余分な比較が行われるため、パフォーマンスが低下する可能性があります)。したがって、小さな値と比較する場合、または値がコレクションよりも小さくなると思われる場合にのみ、これをお勧めします。

于 2019-07-16T22:29:30.660 に答える