eq

2012-01-13 7 views
2

の場合、浮動小数点除算とチェック値の効率が良いです。の場合、正しい結果を得るために値に乗数を適用する必要があります。これは、浮動小数点除算を使用して値を計算することを含む。eq

プロセッサ時間を節約するために浮動小数点ロジックを実行する前に値をチェックすることをお勧めしますが、どちらの方法で実行時に効率がよくなるかわかりません。

私はifのチェックが1または2の命令(アセンブリクラスからしばらくの間)だったと仮定しています。浮動小数点演算はそれ以上のものになるでしょう。

//Check 
if (a != 10) {    //1 or 2 instructions? 
    b *= (float) a/10; //Many instructions? 
} 

aは、「10」はほとんどの時間は、しかし、それは文句を言わないことがいくつかのインスタンスがあることになるだろう。 aが除数に等しい場合でも、浮動小数点除算は非常に多くのサイクルを要しますか?

ifステートメントの前のコードは、単に次のコードよりも効率的に実行されますか?任意の顕著な違いいずれかの方法があること文句を言わないが確かに

//Don't check 
b *= (float) a/10; //Many instructions? 

除数は、物事がプロセッサ重いを取得した場合の配当金に等しいとき、しかし私は、浮動小数点乗算の行動に関しては興味があります。

をはいあなたはコストを比較検討するのは正しいです - それ以外の場合は、おそらく気にしないはずなので、時間の十億を実行し、これはいくつかの非常にタイトなループであると仮定すると、その1-2命令事項の違い

+0

両方のバージョンをマイクロベンチマークしましたか? – millimoose

+0

いいえ、まだ、私は私の質問を更新するでしょう – styler1972

+2

はい、ベンチマークが重要かどうかを判断するためにまず、そうでない場合は、最も簡単なことをしてください。それは、ブランチミスは部門よりも高価なはずなので、ブランチが非常に予測可能でない限り、チェックは価値がないはずです。 – comingstorm

答えて

5

チェックが真である場合には、毎回追加のチェックと節約が行われます。しかし、私の推測では、余分なオーバーヘッドを克服するだけでなく、JITのCPUのパイプライン・ストールによってあなたを遅らせるために、最終的にはより多くのことを行うブランチを導入しているという事実コンパイルされたコードは、あなたが得られる以上のものです。

a == 10の場合は、コードの早い方で、何らかの形でそれを活用する方が、より速く、より速い方法があると思います。

+0

+1人身売買されていないコード領域へのチェックアウトを再考するため – styler1972

3

IIRCは、浮動小数点乗算は除算よりもはるかに安価であるので、これは両方のより速いかもしれません:

b *= (a * 0.1); 
+2

これは10で除算とまったく同じではありません。 – Voo

1

私はマイクロを行うにはキャリパーを使用することをお勧めします。このコードを最適化する必要が終わるならばあなたの内部ループのベンチマーク。これらの小さな変更にどのような影響があるかを正確に予測することは非常に難しいです。特にJavaでは、VMがどのように動作するかは、理論上、コードを最適化することができるため、未知のビットです。いくつかの戦略を試して、何が効果があるかを見てみるのがベスト

http://code.google.com/p/caliper/

関連する問題