私はこれをテストしてきましたが、ここではまだ説明されていない1つの重要な潜在的な欠点があります。それは、丸めタイブレーク方法を変更していることです。
Math.round()
「ラウンドハーフアップ」ルールをround()
実装しますが、メソッドは「ゼロからラウンドハーフアウェイ」ルールを実装します。
例えば:
Math.round(-0.5d)
=>0L
Your.round(-0.5d)
=>-1L
これはあなたにとって問題かもしれないし、そうでないかもしれませんがMath.round()
、NaNと無限の考慮事項がすでに概説された後でも、上記の方法はのドロップイン代替ではないことを理解する必要があります。
別の関連する質問:Javaでの負の数の丸め
パフォーマンスに関しては、上記の方法がよりも大幅に高速であることは間違いありませんMath.round()
。ランダムに生成された正の値と負の値の場合、約35%の時間で実行されます。タイトループでこのメソッドを呼び出す場合、これは価値のある最適化になる可能性があります。おそらく分岐予測を使用しているCPUのために、正の値のみが与えられた場合はさらに良くなります(実行時間の25%) 。
Math.round()
最終的にはネイティブJNI呼び出しによって実装されますが、これがパフォーマンスの違いの原因である可能性があります。このSun/Oracleのバグは、j6u22に純粋なJavaバージョンがある可能性があることを示唆していますが、どこにあるのかわかりません。実際Math.round()
、j6u23では、テストでj6u16と同様に動作します。他のバージョンではテストしていません。