size 和 sizeIs 的区别
Difference between size and sizeIs
List(1,2,3).sizeIs > 1 // true
List(1,2,3).size > 1 // true
Luis 在 comment 中提到
...on 2.13+ one can use sizeIs > 1
which will be more efficient than
size > 1
as the first one does not compute all the size before
returning
Add size comparison methods to IterableOps #6950 似乎是引入它的 pull request。
正在阅读 scaladoc
Returns a value class containing operations for comparing the size of
this $coll to a test value. These operations are implemented in terms
of sizeCompare(Int)
我不清楚为什么 sizeIs
比常规 size
更有效?
据我了解变化。
这个想法是,对于没有 O(1) (常量) size
的集合。然后,sizeIs
可以更高效,专门用于比较小值(如评论中的1)。
但是为什么呢?
很简单,因为不是计算所有大小然后进行比较,sizeIs
return 是一个对象,在计算比较时,可以 return 早。
例如,让我们检查 code
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
}
}
}
因此,在评论的例子中,假设一个非常非常非常长的三个元素的List。一旦知道 List 至少有一个元素和 hasMore
,sizeIs > 1
就会 return。这样就节省了遍历另外两个元素计算大小为3再进行比较的开销。
请注意:如果集合的大小大于比较值,则性能将大致相同 (可能比 size
慢,因为对每个集合进行了额外的比较周期)。因此,我只建议将此用于与小值的比较,或者当您认为值将小于集合时。
List(1,2,3).sizeIs > 1 // true
List(1,2,3).size > 1 // true
Luis 在 comment 中提到
...on 2.13+ one can use
sizeIs > 1
which will be more efficient thansize > 1
as the first one does not compute all the size before returning
Add size comparison methods to IterableOps #6950 似乎是引入它的 pull request。
正在阅读 scaladoc
Returns a value class containing operations for comparing the size of this $coll to a test value. These operations are implemented in terms of
sizeCompare(Int)
我不清楚为什么 sizeIs
比常规 size
更有效?
据我了解变化。
这个想法是,对于没有 O(1) (常量) size
的集合。然后,sizeIs
可以更高效,专门用于比较小值(如评论中的1)。
但是为什么呢?
很简单,因为不是计算所有大小然后进行比较,sizeIs
return 是一个对象,在计算比较时,可以 return 早。
例如,让我们检查 code
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
}
}
}
因此,在评论的例子中,假设一个非常非常非常长的三个元素的List。一旦知道 List 至少有一个元素和 hasMore
,sizeIs > 1
就会 return。这样就节省了遍历另外两个元素计算大小为3再进行比较的开销。
请注意:如果集合的大小大于比较值,则性能将大致相同 (可能比 size
慢,因为对每个集合进行了额外的比较周期)。因此,我只建议将此用于与小值的比较,或者当您认为值将小于集合时。