首页 > 解决方案 > Scala设置交叉点性能

问题描述

使用 Scala 的scala.collection.Set[T]. 给定一个s只有几个元素的小集合和另一个b有很多元素的大集合,两者之间是否存在性能差异:

s & b // s intersect b

b & s // b intersect s.

如果是,哪个最快?

标签: scalaperformance

解决方案


GenSetLike在using中看到的通用实现被一个在我看来相当复杂的实现intersect覆盖(参见scala.collection.immutable.HashSet.HashTrieSet#intersect0)。根据我的粗略基准,两者的性能相似,并且与 的性能相似,比 . 快一个数量级。我的测试代码是:HashSeta & bb & aa filter bb 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

推荐阅读