Skip to main content
 首页 » 编程设计

在哈希表上使用 get() 方法时的 scala 速度 (是否生成临时 Option() 对象)

2025年12月25日21落叶无声

我正在将一些代码转换为 Scala。它的代码位于包含大量数据的内部循环中,因此需要速度快,并且涉及在哈希表中查找键并计算概率。它需要根据是否找到 key 来执行不同的操作。使用“标准”惯用法,代码将如下所示:

counts.get(word) match { 
  case None => { 
    WordDist.overall_word_probs.get(word) match { 
      case None => (unseen_mass*WordDist.globally_unseen_word_prob 
                    / WordDist.num_unseen_word_types) 
      case Some(owprob) => unseen_mass * owprob / overall_unseen_mass 
    } 
  } 
  case Some(wordcount) => wordcount.toDouble/total_tokens*(1.0 - unseen_mass) 
} 

但我担心这种代码会非常慢,因为所有这些临时 Some() 对象都被创建然后被垃圾收集。 Scala2e 书声称智能 JVM“可能”优化这些,以便代码高效地执行正确的操作,但是使用 Sun 的 JVM 真的会发生这种情况吗?有人知道吗?

请您参考如下方法:

如果您启用escape analysis,则可能会发生这种情况在 jvm 中,启用:

-XX:+DoEscapeAnalysis 

在 JRE 1.6 上。本质上,它应该检测正在创建的对象,这些对象不会逃逸方法激活帧,并将它们分配到堆栈上,或者在不再需要它们后立即对其进行 GC。

您可以做的一件事是使用 scala.testing.Benchmark 对您的代码进行微基准测试特征。只需使用单例对象扩展它并实现 run 方法,编译并运行它。它将多次运行 run 方法,并测量执行时间。