我正在将一些代码转换为 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 方法,并测量执行时间。


