2016-05-30 8 views
0

Javaの2つの3D点間の距離を計算すると、Math.sqrtへの呼び出しを避けて距離または距離の二乗を計算できます。距離の2乗と距離の実際のメリット

ネイティブでは、sqrtは乗算の速度のわずか4分の1なので、距離の平方根を使う価値はないという不便さがあります。

Javaでは、乗算と平方根の計算の間の絶対的なパフォーマンスの違いは何ですか?

+2

をしたい場合はより多くのコードを提供し、これを答えるための唯一の方法は、「絶対に」のベンチマークにあなたのコードの違いです。 [義務的なリンク](http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java) –

+0

私のテストでは、 'dx * dx + dy * dy 'は' Math.sqrt(dx * dx + dy * dy) 'の約2倍の速さで実行されます。あなたは4倍の違いを意味する*「スピードの1/4」と言いました。 2倍から4倍の速さで問題がなければ、それは問題ではありませんか?物事の全体的なスキームでは、あなたがそれを*多くすれば重要です。 **早すぎる最適化に気をつけてください。**問題を測定する場合は修正してください。パフォーマンスについての仮定(誤った?)に基づいてコードを畳み込まないでください。 – Andreas

+0

距離を計算するには、平方根の平方根をとっています。トレードオフはありません。平方根は純粋なオーバーヘッドです。時間がかかりますが、通常の距離を計算するには余分な平方和が必要です。 – harold

答えて

0

行くので、ここで、私は最初はコメントとしてこれを追加したいが、それはあまりにも入札を取得するために開始しました:

はそれを自分で試してみてください。 a*a + b*bを計算し、Math.sqrt(a*a + b*a)を計算する別のループを計算する10.000回の繰り返しでループを作成します。時間を計るとあなたが知るでしょう。 square rootを計算することは、デジタル(コンピュータビット)平方根が、十分に近いまで(与えられた数の実際の平方根に近づく)反復プロセスである(各反復間の差がある実際の小さな値)。 Mathライブラリの使用のほかに複数のアルゴリズムがあり、その速度は入力とアルゴリズムの設計方法によって異なります。私の意見ではMath.sqrt(...)と固執してください。間違ってはいけません。多くの人によってテストされています。

これは1平方根で非常に高速に実行できますが、明確な観測可能な時間差があります。

私は平方根を2回以上、通常は最後に計算する理由は考えられません。ポイント間の距離を知りたい場合は、その距離の自乗値をデフォルト値として使用し、そのデフォルト値に基づいて比較/合計/減算を行います。

PS:あなたはより多くの「実用的」な答え