パフォーマンスが非常に重要な状況にあります。double
私のアルゴリズムの中核には、2 つのプリミティブを使用していくつかの基本的な計算を行うメソッドがあります。このメソッドは、アルゴリズムの実行ごとに 1,000 万回以上呼び出されます。
コードは次のようになります。
public int compare(double xA, double xB, double yA, double yB);
double x = xA * xB;
double y = yA * yB;
double diff = x - y;
return (diff < 0.0 ? -1 : (diff > 0.0 ? 1 : 0));
}
パラメータxA
とyA
セットから値を取得します。このセットは、コードで微調整できます。セットに入れる値によって、大きな (約 2 倍の) パフォーマンスの違いが見られます。セットに a0.1
または aが含まれている0.3
と、パフォーマンスが大幅に低下するようです。セットを の倍数にしておくと0.5
、最高のパフォーマンスが得られます。
コンパイラはなどとして最適化x * 0.5
していx >> 1
ますか? それとも0.1
バイナリで定義できないからですか?
これを最適化できるように、この状況をもう少しよく理解したいと思います。javac と jvm (この場合はホットスポット) が二重乗算を処理する方法を正確に知っている人がいない限り、これは非常に難しい問題になると思います。