Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Scala中集合并集的性能问题_Performance_Scala_Set_Union - Fatal编程技术网

Performance Scala中集合并集的性能问题

Performance Scala中集合并集的性能问题,performance,scala,set,union,Performance,Scala,Set,Union,我刚刚在Scala Set API中遇到了一个奇怪的行为。这里是我的功能剥离与项目其余部分相关的内容 def grade(...): Double = { val setA: HashSet = // get from somewhere else val setB: HashSet = // get from somewhere else if ((setA size) == 0 || (setB size) == 0) return 0 else return (setA &

我刚刚在Scala Set API中遇到了一个奇怪的行为。这里是我的功能剥离与项目其余部分相关的内容

def grade(...): Double = {
  val setA: HashSet = // get from somewhere else
  val setB: HashSet = // get from somewhere else
  if ((setA size) == 0 || (setB size) == 0) return 0
  else return (setA & setB size) / (setA | set B size)
}
这个函数在一个循环中被多次调用,整个循环大约在4.5秒内执行。但是,当使用大小之和(总近似值)替换并集的大小时,为了测试并集操作的影响,执行时间减少到0.35秒左右

def grade(...): Double = {
  val setA: HashSet = // get from somewhere else
  val setB: HashSet = // get from somewhere else
  if ((setA size) == 0 || (setB size) == 0) return 0
  else return (setA & setB size) / (setA size + set B size)
}

好吧,你不能把一个简单的运算,比如2个
整数的和与2个集合的
并集
运算相比较。我期望这些操作的性能会有很大的不同,特别是当您的集合包含很多元素时

你不需要工会,因为你已经做了一个十字路口。请尝试以下操作:

def grade: Double = {
  val setA: HashSet = // get from somewhere else
  val setB: HashSet = // get from somewhere else
  if ((setA size) == 0 || (setB size) == 0) return 0
  else {
     val inter = setA & setB size
     return inter / ((setA size) + (setB size) - inter)
  }
}

但是,我发现您的度量有点奇怪,因为我希望两个操作(并集和交集)都需要大约相同的时间O(n)。拆下接头将使性能提高一半(2s)

您是否有可能使用并行集合?联合是以顺序方式执行的,因此任何并行集合都首先转换为顺序集合。这可能是性能下降的原因


除此之外,联合是关于O(n),所以你要从O(n)到O(1),这会产生很大的不同。

是的,谢谢你的技巧,这是我用来快速修补的。但我是直截了当的:工会存在问题。证据是,使用你的技巧,执行时间与我的版本大致相同,只有总和。只有当您只需要大小而不需要实际的并集时,这个技巧才有效。@Simon Bouget-集合交集和并集的性能相同吗?更改上面的代码以执行并集而不是交集,然后使用并集的大小计算交集的大小。如果这与并集的性能类似,那么可能只是O(1)操作(例如,添加大小)与O(n)操作(例如,实际执行两个集合的并集)的问题。不,我没有使用并行集合。至于你的另一点,我猜交集也是O(n),我得到了与我的第一个版本类似的性能,只有和和和,以及bruno conde的解,从交集的大小计算并集的大小。我寄给Scala bugtracker,他们似乎把我的例子看作是一个错误的行为。