0

我突然意识到,用函数式编写真的并不难,所以我决定重构我的一些工作,从我的代码中删除可变集合。loc只是融化了。现在我有一个 Seq 代表一组被监督的演员,每次完成时我都需要从序列中删除它。我想在功能上你会创建一个新的序列并用新的序列做一个 akka 。

def shepherd(categories: Seq[ActorRef]) : Receive = {
  case ForumCrawler.Done() => {
    val new_categories = categories.filter(a => a != sender)
    if(new_categories.size == 0) {
      println("all done")
      system.shutdown()
    }
   context.become(shepherd(new_categories))
}

当演员序列在 10k 区域时,这仍然是一种可行的方法吗?scala 是否会以某种方式改变幕后的序列,还是我会得到一套完整的副本?

这有点让我觉得select 回到了过去,只是可能更糟=D

4

1 回答 1

0

让我们为 10K 序列做一些计算。最坏的情况是如果选择的 ActorRef 总是最后一个。然后你将不得不进行10000+9999+...+2+1迭代,或者(10000*10001)/2 = 50 005 000. 计算这个的一般公式:

公式

我认为您不想在最坏的情况下进行 5000 万次迭代 :)。让我们使用不同的数据结构,看看Scala 集合的性能特征总是好的。唯一具有恒​​定移除复杂度的不可变结构是HashSetand HashMap。我们没有键值对,所以HashSet就足够了。由于这是在 Actor 中,因此您可能会使用可变结构,因为它保证在单个线程上运行,因此另一个选项是WeakHashMap.

因此,使用以下方法重写您的解决方案HashSet

def shepherd(categories: HashSet[ActorRef]) : Receive = {
  case ForumCrawler.Done() =>
    val newCategories = categories - sender
    if(newCategories.size == 0) {
      println("all done")
      system.shutdown()
    }
    context.become(shepherd(newCategories))
}
于 2013-11-13T11:34:18.720 回答