2011-07-28 6 views
2

私はJavaのエキスパートではないので、私はJavaの小さなアプリケーションを作成しました。私のプログラムはそれほど効率的ではありません。 いくつかの経験のある人は、私の次の質問にお答えします場合、私は感謝するでしょう:より高速であるどんなプログラミング方法がより速いのですか?

どちら:

Question1

boolean b1; 
b1=true; 

または

boolean b1= true; 

質問2

boolean b1; 
boolean b2; 

又は

boolean b1, b2; 

Question3

for (int index goes to some iterations) 
{ 
MyCustomClass obj = new MyCustomClass(); 
//Some other code goes here 
} 

又は

MyCustomClass obj = new MyCustomClass(); 
for (int index goes to some iterations) 
{ 
obj.Reset();// Assume .Reset() have same codes as zero argument constructor has 
//Some other code goes here 
} 

事前に感謝

+13

あなたはそれを試してみてはどうでしょうか? – skaffman

+1

試しましたか?宿題のように見える? –

+5

"私たちは小さな効率を忘れるべきです、時間の約97%を言いましょう:時期尚早最適化はすべての悪の根源です" - Knuth – Dave

答えて

10
  1. どちらもありません。これはミクロ最適化でさえありません。
  2. どちらでもない
  3. Reset()が新しいオブジェクトを作成することによってどのくらいのゴミが生成されるかによって異なります。
6

1)同じです。それらは少なくとも同じバイトコードにコンパイルされます。

2)同じこと。

3)ループ内にコンストラクタがないため、メモリが少なくて済み、ガベージコレクタが少なくて済むため、2番目の方が優れています。質問3については

5

質問1と質問2の農産物同じバイトコード

は、あなたのオブジェクトに依存するが、一般的に必要でない限り、ループ内で新しいオブジェクトを作成しないでください。

1

一般に、どのようにコード化しても、コンパイラは結果を最適化する方法を知っています。最初の質問では、問題ではないと私は思う。最後の一つを

:あなたがループ内で新しいオブジェクトを作成する場合は、それを作成するいくつかの時間を失うでしょう:メモリの割り当てを、など

あなたはループの外でそれを作成した場合、それらは一つだけを呼び出しますメソッドをループ内で使用すると、すべてのメモリ割り当てなどを処理する必要がないため、処理が高速になります。

4

質問1と質問2については、同じバイトコードでコンパイルすると思われます。この点に関してのみ異なる2つのクラスファイルを実際にコンパイルし、バイトコードを調べることで、これを簡単にテストできます。私は正直なところ、なぜ同じコードに最適化されないのかわかりませんが、私はJavaコンパイラの専門家ではありません。それが問題であっても、その差は非常に小さく、システム全体の性能に関しては問題にならないでしょう。

質問3については、オブジェクトをリセットする方がおそらく早いでしょう。オブジェクトの作成は比較的高価です。 FindBugsやPMDなどの静的解析ツールは、ループ内でのオブジェクト作成を実際に探し、フラグを立てます。もちろん、それはReset()が何をしているかによって決まります。

「最適化」と同様に、注意してください。まず読みやすいコードを書いてください。次に、アプリケーションをテストします。パフォーマンスが問題の場合は、プロファイルを作成してボトルネックを見つけ、パフォーマンスの最も低い領域を最初に修正します。

関連する問題