2

条件付きループを個別に実行するのに必要な時間を知りたいです。「if else」、「while」、「for」、または「foreach」ループを使用するオプションがあった場合、どのループがより速く実行されるかのように.私は違いが非常に小さいことを知っており、ほとんどの人はそうではないと言うでしょう.問題ですが、何千ものデータにアクセスするプログラムがあれば、この点が明らかになります。

Javaで最初に変数を宣言するかどうか、使用する直前に変数を宣言するかどうかを知りたいのですが、違いはありますか。所要時間の合計は短縮されますか? はいの場合、実際に使用されているのはどれですか(変数が最初に宣言されているもの、または使用されている b4 と宣言されている場所)?

4

8 に答える 8

14

マイクロ最適化を停止します。

システムに最適なアルゴリズム、最適なデータ構造、最適な設計を見つけ、最も読みやすいコードを書くことに時間を費やしてください。これらのささいなことではありません。

于 2010-05-05T09:46:48.750 に答える
7

コードを手動で最適化しようとしてもあまり意味がありません。JIT コンパイラは、あなたよりもはるかに優れた仕事をする可能性があります。特に、実行時点での正確な環境について、コンパイル前よりもはるかに多くの情報が得られるためです。

さらに、オプティマイザーは「一般的なケース」に合わせて調整されているため、一般的でない最適化をコードに導入すると、実際には JIT コンパイラーによる最適化が難しくなり、最終的に遅くなる可能性があります。

それにもかかわらず、それでも本当に何かを測定したい場合は、次のようにすることができます。

long before = System.currentTimeMillis();
// execute your code e.g. a million times
long after = System.currentTimeMillis();
System.out.println("Execution took " after - before " milliseconds");
于 2010-05-05T09:50:09.720 に答える
2

はっきりさせておきましょう。ここでマイクロ最適化しています。それは時間の無駄です。最適化のルールは次のとおりです。

  1. しないでください。
  2. (専門家のみ!)まだそれをしないでください。

優れたアルゴリズムを使用するようにコードを記述します。明確にするためにコードを書いてください。それでも問題がないか確認してください。問題が実際に存在する場所を見つけるために測定します。その場合にのみ、必要な場合にのみ最適化してください。(特に、IDEなどの重要な他のものがメモリにある場合は、最近のコンピュータで適切なタイミングの数値を取得するのは非常に難しい場合があることに注意してください。)

于 2010-05-05T10:02:57.030 に答える
2

Hotspot がコードに対して行う場合と行わない場合があるすべての最適化のため、一般的なケースで答えることは不可能です。

polygenelubricants が言うように、重要なことは明確で簡潔なコードを書くことです。これは人間にとって理解しやすいだけでなく (おそらく最も重要なことです!)、最適化するコンパイラーが「理解」して効率的なコードに変換することも容易になります。 、 それも。

パフォーマンスの問題がある場合は、プロファイラーをクラックアウトし、コードが実際に時間を費やしている場所を確認し、そのセクションを最適化します。繰り返しますが、これには通常、わずかに異なるプリミティブを使用するのではなく、アルゴリズムを改善することが含まれます。

于 2010-05-05T09:52:10.720 に答える
2

それらが関連している場合、違いは非常に小さいでしょう:-)

最近では、foreach ループと while ループの違いを考えるよりも、明確で保守しやすいコードを書くことがはるかに重要になっています。

javac コンパイラは結果のバイトコードを最適化するため、違いはありません。また、使用するアルゴリズムも非常に具体的です。

最初に変数を宣言すると (? "最初" とは?)、可視性に影響を与える可能性がありますが、アプリケーションのパフォーマンスには影響しない可能性があります。

とにかく、このようなパフォーマンスの最適化に興味がある場合は、Sun の Java VM ホワイトペーパーを参照してください: http://java.sun.com/docs/performance/

また、Java アプリケーションの「プロファイリング」を確認して、違いを自分で確認したい場合もあります。オープン ソース Java プロファイリング ツールのリストは次のとおりです: http://java-source.net/open-source/profilers

于 2010-05-05T09:55:02.363 に答える
0

違いはマイクロ秒単位であり、数千のレコードはミリ秒単位の違いを意味します。

そもそも何千ものレコードを読み取ったり処理したりする必要がある理由を考えてみてください。

于 2010-05-05T09:52:02.307 に答える
0

@polygenelubricants と @Péter Török に同意します。

ただし、教育目的で、次のjavapコマンドを使用して、さまざまな種類のループのコンパイル済みコードを比較できます。

$ javap -v YourClass
于 2010-05-05T09:52:42.607 に答える
-1

自分で調べてみませんか?大きなループを持ついくつかの smAll プログラムを作成し、測定を行ってください!

于 2010-05-05T09:51:12.453 に答える