いくつかのコードをScalaに変換しています。これは、非常に大量のデータを含む内部ループにあるコードであるため、高速である必要があり、ハッシュテーブルでキーを検索して確率を計算する必要があります。キーが見つかったかどうかによって、異なることを行う必要があります。「標準」イディオムを使用すると、コードは次のようになります。
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を使用して発生しますか?誰か知ってる?