2

Javaコンパイラは、以下のループを抽出することによって最適化するのに十分スマートですか?

Double average = new Double( totalTime / callCount ); 

forループの外?

public double computeSD( Set values, int callCount, long totalTime ) {
  double diffs = 0.0d; 
  for( Iterator i=values.iterator(); i.hasNext(); ) {
    double value = ( ( Double )i.next() ).doubleValue(); 
    Double average = new Double( totalTime / callCount ); 
    diffs += ( value – average.doubleValue() ) * ( value – average.doubleValue() );
  } 
  double variance = diffs / callCount;
  return Math.sqrt( variance );
}
4

5 に答える 5

4

Java はそれをループから抽出しませんし、抽出することもできません。「new」キーワードを使用すると、常に新しいオブジェクトが作成されます。使ったほうがいいでしょうDouble.valueOf()

次の Javadoc を参照してくださいDouble.valueOf(double)

"指定された double 値を表す Double インスタンスを返します。新しい Double インスタンスが必要ない場合は、通常、コンストラクター Double(double) よりも優先してこのメ​​ソッドを使用する必要があります。頻繁に要求される値をキャッシュします。」

このメソッドを使用すると、毎回同じオブジェクトが返されるため、作成されるオブジェクトの数が減り、パフォーマンスが向上します。

ただし、使用することvalueOfはまだ答えではありません。

valueOfは依然としてメソッド呼び出しであり、メソッド呼び出しは最適化されません。valueOfループのすべての反復を呼び出します。メソッドを調べて、メソッド呼び出しを数えます。現在は と を含めて 6 でhasNextありnew Double、メソッド呼び出しに似ています。これらはすべて毎回発生し、Java の最適化によってそれが変わることはありません。リファクタリングして、ループからできるだけ多くのメソッド呼び出しを削除することをお勧めします。

于 2012-09-24T20:27:59.830 に答える
4

バイトコード コンパイラ (java->bytecode) による最適化の実行を妨げるものは何もありません。私が Symantec で働いていたとき、彼らは Java IDE を作成しました。コンパイラの作成者は、コンパイラにいくつかの最適化を入れることを検討しましたが、(外部の世界では) 誰も興味を持っていないようで、焦点はジャスト イン タイム (JIT) にあると言いました。これは、最新の Sun VM の HotSpot とほぼ同じです。

バイトコード コンパイラが最適化を実行するのを妨げるものは何もありませんが、私はそうするものを認識していません。ランタイムの最適化に大きな焦点が当てられていますが、それらは実行時にはほとんど隠されています。

そのため、source->bytecode コンパイラはおそらく最適化しませんが、VM はおそらく最適化します。Android のようなものを使用している場合、おそらくランタイムの最適化は実行されません。

于 2010-03-06T03:55:29.977 に答える
2

これは最初は明らかな最適化のように思えるかもしれませんが、オブジェクトのインスタンス化が含まれているため、そうは思いません。確かに、これは不変のプリミティブ ボックス型のインスタンス化ですが、それでも副作用がないことは保証されません。

現在のコンパイラでこれを最適化できるとは思いません。これを最適化するには、一部のクラスに特別なプロパティがあることをコンパイラに通知する必要があります (これは、将来変更される可能性があるため、危険な命題になる可能性があります)。つまり、API の詳細をコンパイラに通知する必要があります。これは、言語レベルだけで最適化することはできません。

ただし、を使用するdoubleと、最適化される可能性が高くなります (たとえば、ループ不変コード モーション手法を使用)。

于 2010-03-06T03:26:58.620 に答える
2

本当に確認したい場合は、この質問への回答で、JIT コンパイラーが生成するネイティブ コードを確認する方法がわかります。

于 2010-03-06T03:46:52.897 に答える
0

あまり。コンパイラはbyte-codeを書き出すだけです。コードを最適化したものがあるとすれば、それは Java 仮想マシンであり、それはおそらくプラットフォーム、実装、および実行条件に依存します...

于 2010-03-06T03:21:06.897 に答える