web-dev-qa-db-ja.com

廃止Java最適化のヒント

Javaコンパイラ、特に プロファイルに基づく最適化 によって廃止されたパフォーマンスに関するヒントがいくつかあります。たとえば、プラットフォームによって提供されるこれらの最適化は、(ソースに従って)大幅に削減できます。仮想関数呼び出しのコストVMは、メソッドのインライン化、ループの展開なども可能です。

あなたがたどり着いた他のパフォーマンス最適化手法は何ですか?

42
Dan

メソッドとメソッドパラメータの最後の修飾子は、パフォーマンスにまったく役立ちません。

また、 Java HotSpot wiki は、HotSpotで使用される最適化の概要と、Javaコードでそれらを効率的に使用する方法を示しています。

23
Eugene Kuleshov

String a = "this" + var1 + " is " + var2;をStringBuilderまたはStringBufferへの複数の呼び出しで置き換える人々。実際にはすでに裏でStringBuilderを使用しています。

20
Paul Tomblin

パフォーマンスの最適化を開始する前に、時間とメモリのトレードオフを定義する必要があります。これは私が私のメモリ/時間重視のアプリケーションのためにそれを行う方法です(完了するために上記のいくつかの答えを繰り返します):

  1. ルール#1開発の初期段階ではパフォーマンスの最適化を行わないでください。本当に必要がない場合は行わないでください。それを行うことに決めた場合、次のようになります。
  2. プロファイラーを使用してボトルネックを見つけ、ソースコードを確認してボトルネックの理由を見つけます。
  3. 定義された時間/メモリのトレードオフに最も適合する適切なデータ構造を選択します。
  4. 適切なアルゴリズムを選択します(たとえば、反復と再帰など)。
  5. Javaライブラリの同期オブジェクトを使用する必要がない場合は、使用しないでください。
  6. 明示的/暗黙的に新しいオブジェクトを作成しないでください。
  7. Javaで提供されるデータ型/アルゴリズムをオーバーライド/再実装し、それらが要件に適合しないことが確実な場合に限ります。
  8. 小規模な独立したテストを使用して、選択したアルゴ/データ構造のパフォーマンスをテストします。
16
khachik

2001年に、J2ME電話用のアプリを作成しました。レンガくらいの大きさでした。そして、レンガの計算能力に非常に近い。

Javaアプリを適切に実行するには、可能な限り手順に沿ってアプリを作成する必要があります。さらに、ArrayIndexOutOfBoundsExceptionをキャッチしてすべてのループを終了することで、パフォーマンスが大幅に向上しましたベクター内のアイテム。考えてみてください。

Androidであっても、配列内のすべての項目を「高速」でループし、同じことを「低速」で書く方法があります。Googleで言及されているIO dalvikのビデオVM internals。

しかし、あなたの質問への回答では、最近この種のことをマイクロ最適化する必要があるのは最も珍しいことだと私は思います、そして私はさらにJITでそれを期待しますVM(新しいAndroid 2.2 VM、JITを追加)でさえ、これらの最適化は無意味です。2001年に、電話はKVMインタプリタを33MHzで実行しました。今ではdalvikを実行しています-aはるかに高速VMよりもKVM-500MHz〜1500MHzで、はるかに高速ARMアーキテクチャ(より優れたプロセッサで、クロックスピードゲイン)L1などとJITが到着します。

Java-電話またはデスクトップでi7を使用して直接ピクセル操作を行うのに慣れている領域にはまだいないので、通常の毎日のコードはまだありますそのJavaは十分に高速ではありません。 これは興味深いブログです 専門家は、Javaの80%はいくつかの重いCPUタスクのC++速度;私は疑わしいです、私はイメージ操作コードを書き、Javaとネイティブのforループピクセルの間の桁違いの大きさを見ます。たぶん私はいくつかのトリックを逃しているでしょう。 ..?:D

8
Will
  1. ガベージコレクターを手動で呼び出さないでください。最新のJVM実装のパフォーマンスが低下します。
  2. Longの代わりにIntegerは多くのスペースを節約しませんが、数値の範囲を制限します。
  3. 手動で生成したEnumクラスを避け、代わりに組み込みのEnumを使用してください。 Java 1.5導入された実際のEnum、それらを使用します。
4
Michael Shopsin

RAM 32GB未満)でx64 JVMを使用する場合:

64ビットのJVMは、通常のオブジェクトポインターが大きいため、32ビットのJVMと比較して30%〜50%多くのメモリを使用します。 JDK6 +を使用すると、この要素を大幅に減らすことができます。

JDK6u6pからJDK6u22まではオプションであり、JVM引数を追加することで有効にできます。

-XX:+UseCompressedOops 

JDK6u23(JDK7も)から、デフォルトで有効になっています。詳細 ここ

2
  1. 「時期尚早な最適化がすべての悪の根源」(ドナルド・クヌース)
  2. ボトルネックのみを最適化すると便利です。
  3. それぞれの状況でコードを分析する必要があります。おそらく、並べ替え機能が必要ないため、TreeSetを高速なHashSetで置き換えることができます。あるいは、doubleの代わりにfloatを使用することもできます(Android SDKをご覧ください)。
  4. テクニックが役に立たない場合は、コードを書き直して [〜#〜] jni [〜#〜] で呼び出すことができるので、ネイティブコードが機能します。
1
Vladimir Ivanov

上記のリンクが古くなっています。 Java最適化: http://www.appperfect.com/support/Java-coding-rules/optimization.html に新しいものがあります。

0
Zon