2013-04-19 13 views
5

Scala 2.10では、ボックスにはsomeDouble.isNaNが必要ですか?私のコードを実行して.isNaNをデコンパイラで呼び出すと、私はまだコード内でdouble2Doubleへのtelltaleコールを参照しています。新しいAnyValが2.10で動作するとすれば、ランタイムにjava.lang.Double.isNaN(someDouble)より悪いことはありません。何か不足していますか?Scala 2.10、Double.isNaN、boxing

答えて

6

は残念ながら、isNaNjava.lang.Doubleの方法であり、そしてjava.lang.Doubleへの暗黙的な変換を持つことが不可欠であるので、ScalaのRichDouble値のクラスが速くなるようにisNaNを再実装することはできません、あなたがisNaNを使用するときにjava.lang.Doubleのボックス。

これはNaNをテストするだけ遅いか、厄介な方法を残しているので、私は

implicit class RicherDouble(val d: Double) extends AnyVal { 
    def nan = java.lang.Double.isNaN(d) 
} 

を定義し、私はちょうどチェックする.nanを使用することができます。

+0

なぜこれはダブル以上のボクシングより速いのでしょうか? – gzm0

+3

@ gzm0 - これは値クラス(これは 'AnyVal'部分です)に"囲み "ます。これは、オブジェクトまたはジェネリックとして渡すか、または配列に入れる必要がないかぎり、実際には作成されません。あなたがここにいるのと同じように(もしあなたがここにいるように)使うのであれば、実際のオブジェクトが存在することは実際には何もないので、Scalaは単にメソッド呼び出しであるバイトコードを発行します。 –

+0

あなたの 'RicherDouble'に暗黙的に高い優先順位を付けることはできませんでした。同じ' isNaN'名を付けましたか?そうでない場合は、同じ優先順位の何かがあいまいで失敗して、タイトなループでその方法を使用しないように思い出させてください。 –

関連する問題