私は繰り返し繰り返しの数が多いと非常にタイトなループ内で、次の式を評価するJavaメソッドを持っています。Math.abs(a-b) - Math.abs(c-d)の実装は高速ですか?
Math.abs(a - b) - Math.abs(c - d)
a
、b
、c
とd
は彼らの全体の範囲に及ぶことができlong
値であり、タイプ。それらは各ループ反復で異なり、それらは私が知っている不変量を満たさない。
プロファイラは、プロセッサ時間のかなりの部分がこのメソッドで費やされたことを示します。私はが最初に最適化の他の手段を追求している間、上記の表現を計算するよりスマートな方法があるかどうか疑問に思っていました。
Math.abs()
の呼び出しを手動で実行すると、非常にわずかな(あれば)パフォーマンスが向上しますが、この式の評価を高速化するために使用できる数学的なトリックはありますか?
値がその型の範囲全体に及ぶ場合、たとえばaが非常に大きな負の数であり、bが次のような場合にこのコードでオーバーフローが発生します。非常に大きな正の数(またはその逆)。アルゴリズムを確認してください。 –
@JBNizet:私はまだオーバーフローに遭遇していないので、ある種の不変であると思います。 「全範囲に渡る」条件は、ほとんどが、例えば、すべての変数は32ビットで収まります。 – thkala
このようなオーバーフローは例外を発生させないことに注意してください。したがって、彼らは気づかれなかったかもしれません。 –