scala - Scala设置交叉点性能
问题描述
使用 Scala 的scala.collection.Set[T]
. 给定一个s
只有几个元素的小集合和另一个b
有很多元素的大集合,两者之间是否存在性能差异:
s & b // s intersect b
和
b & s // b intersect s.
如果是,哪个最快?
解决方案
GenSetLike
在using中看到的通用实现被一个在我看来相当复杂的实现intersect
覆盖(参见scala.collection.immutable.HashSet.HashTrieSet#intersect0)。根据我的粗略基准,两者的性能相似,并且与 的性能相似,比 . 快一个数量级。我的测试代码是:HashSet
a & b
b & a
a filter b
b filter a
object Sets extends App {
def time[R](block: => R): R = {
val t0 = System.nanoTime()
val result = block // call-by-name
val t1 = System.nanoTime()
println("Elapsed time: " + (t1 - t0)/1e6 + "ms")
result
}
val a = (0 until 10000 by 1).toSet //smaller data
val b = (0 until 1000000 by 2).toSet
time {a & b}
time {b & a}
time {a & b}
time {b & a}
time {a & b}
time {b & a}
println("Filter")
time {a filter b}
time {b filter a}
time {a filter b}
time {b filter a}
time {a filter b}
time {b filter a}
}
结果是:
经过时间:6.990442ms 经过时间:4.25017ms 经过时间:4.1089ms 经过时间:4.480789ms 经过时间:3.71588ms 经过时间:3.160159ms 筛选 经过时间:7.781613ms 经过时间:68.33023ms 经过时间:5.858472ms 经过时间:42.491131ms 经过时间:2.982364ms 经过时间:52.762474ms
推荐阅读
- node.js - 在没有客户端框架的情况下使用 Webpack 和 Express.js 时如何要求资产?
- postgresql - Heroku PostgreSQL 中的图像不接受图像二进制数据并使用 \ 字符
- android - 为什么数据库是空的?
- wordpress - Wordpress 分页链接不适用于自定义查询
- wordpress - WP - 仅在帖子不存在时插入帖子
- ios - 从另一个单元格输入一个数据后如何清除文本字段中的文本
- php - 如何使用 HREF 从另一个文件调用 PHP 函数
- python - googletrans 停止使用错误“NoneType”对象没有属性“组”
- c# - 如何在 UWP 中使用 3 级语义缩放?
- python - 如何在 Python for 循环中创建变量名?locals() 函数是最好的方法吗?