Javaコードの最適化(上)
最終の改質剤(1)可能な限り指定されたクラス、メソッドとして
final修飾子クラスと派生されていません。JavaコアAPIでは、java.lang.Stringなど、最終的なアプリケーションの多くの例があり、クラス全体は、最終あります。クラスのための最終的な修飾子を指定したクラスは、最終的な修飾方法はオーバーライドできないようにする方法として指定し、継承することはできませんことができます。最終としてクラスならば、すべてのメソッドのクラスは最終的なものです。Javaコンパイラは、すべてのメソッドで、最終的な内の機会のために、50%の平均でパフォーマンスを向上させることができ、移動をするJavaの運用効率を向上させるためのインライン重要な役割を見ていきます。
(2)オブジェクトを再利用しよう
これは、Stringオブジェクトは、文字列が接続されている場合は特にStringBuilderの/ StringBufferの場所を使用する必要があります。Java仮想マシンがオブジェクトを生成するのには時間がかかるだけでなくので、将来的には、プログラムのパフォーマンスに大きな影響をもたらすでしょう、したがって、ガベージコレクションおよび処分のため、これらのオブジェクトに時間を費やすあまりにも多くのオブジェクトを生成する必要があるかもしれません。
(3)可能な限り、ローカル変数を使用します
配信メソッド呼び出しのパラメータとコールで作成した一時変数がスタックに格納され、より速く、など静的変数、インスタンス変数、などの他の変数は、ヒープ、低速で作成されます。また、操作の方法で作成したスタック変数は、コンテンツがなくなって、追加のガベージコレクションを完了していません。
(4)フローを閉じ
私は/ Oストリームの操作は、使用後に、速やかに解放リソースにシャットダウンしたときに、Javaプログラミング、データベース接続は、注意してください。これらの大きなオブジェクトの操作の大規模なオーバーヘッドシステムの原因となりますので、わずかなミスが重大な結果につながります。
(5)演算変数の重複を最小限にするために
明確なコンセプト、メソッド呼び出しは、方法は一つだけの文章であっても、また方法、復旧サイト完成し、呼び出し元のメソッドを呼び出すときに、サイトを保護するために、スタックフレームの作成など、そこに消費されています。したがって、たとえば、次の操作:
以下のために(; I <はlist.size(); int型iが0を= I ++)
{...}
推奨代替品:
(; I <長さ、I ++ INT iは0、長さ=はlist.size()=)を用
{...}
多くの消費を減らすこのように、はlist.size()に多くの時間、
必要なときにのみ作成された(6)遅延ロード戦略を最大限に活用、
例えば:
文字列str = "AAA";
(私は== 1)であれば
{
list.add(STR)。
}
推奨代替品:
(私は== 1)であれば
{
文字列str = "AAA";
list.add(STR)。
}
(7)異常慎重に
パフォーマンスへの異常な有害。例外は、新しいオブジェクト、にfillInStackTrace(という名前のローカル同期方式インタフェースのThrowableコンストラクタ関数呼び出し)を作成するために、最初にスローされコレクト情報コールトラッキングにスタックをチェックするために、にfillInStackTrace()メソッドです。新しいオブジェクトがプロセスで作成されているため、限りスローされる例外があるとして、Java仮想マシンは、コールスタックを調整する必要があります。例外は唯一のエラー処理のために使用することができ、プログラムの流れを制御するために使用すべきではありません。
(8)...ループください... catchでは使用しないでください、あなたは最も外側の上に置く必要があります
私は疑問だと思うネチズンが提起した見解によると、
アレイ状の底面に設定されて追加されるコンテンツの推定長さは、ツールが初期長さを指定した場合(9)
そのようなStringBuilderの例に、等のArrayList、LinkedLlist、のStringBuilder、StringBufferの、HashMapの、HashSetの、など。
16文字のStringBuilderを()//デフォルト・スペースの割り当て
StringBuilder(int型のサイズ)//デフォルトスペースの割り当てサイズの文字
16文字のStringBuilderの(String str)文字//デフォルトの割り当ては+ str.length()文字スペース
クラスによってパフォーマンスを大幅に向上させることができ、その初期容量を設定するコンストラクタ(本明細書では単にのStringBuilder上記で言及)。例えばStringBuilderのバーの長さを保持することができ、現在のStringBuilder内の文字の数を示します。StringBuilderのが最大容量に達した時は、それ自体が2プラス2倍の電流容量を増加しますのでStringBuilderのが最大容量に達したときに、それは新しい文字配列し、古いキャラクターを作成する必要があります文字の新しい配列に配列の内容をコピーする - これは非常にコスト業績です。あなたは5000に最も近い2のべき乗の長さを指定せずに5000文字程度ストアへの文字配列にかかわらず、拡張プラス2の時、4096で見積もることができれば、その後、想像:
4096、8194に基づいて、その後、文字配列のサイズを適用し、開始が2倍以上のスペースを節約し、文字配列5000のサイズを指定することができた場合、提出された12290文字配列のサイズと同等まで追加
文字の新しい配列にコピーし、元の4096個の文字を行きます
このように、メモリ空間の浪費とコードの効率を低下させます。合理的な初期容量を設定するためのツールのセットを達成するために、基になる配列が間違っていないとそう、それはすぐに結果をもたらすでしょう。しかし、HashMapのように、この配列は、セットリストを達成することをノートは+である、あなたがテーブルの上に接続オブジェクトの可能性はほぼゼロであるという理由だけで、のように、初期サイズとセットの大きさを推定します。2,000の要素が新しいHashMapの(128)、新しいハッシュマップ(256)を使用してもよい提供があると推定される場合、2の初期サイズN番目のパワーを設定することを推奨。
(10)System.arraycopyの()コマンドを使用して、大量のデータをコピーするとき
(11)乗算と除算のシフト操作を使用して
例えば:
用(ヴァル= 0;ヴァル<100000;ヴァル+ = 5)
{
= 8 *を持ちます。
B =ヴァル/ 2。
}
コンピュータの底面には、動作位置が最も便利であるので、シフト操作が大幅にパフォーマンスを向上させることができ、最速は、それは次のように改正提案されています。
用(ヴァル= 0;ヴァル<100000;ヴァル+ = 5)
{
A =ヴァル<< 3。
B =ヴァル>> 1。
}
シフト動作が速いかもしれないが、コードを作るあまりよく理解かもしれないが、それは適切なコメントを追加することをお勧めします。
(12)循環参照内のオブジェクトを作成し続けないでください。
例えば:
以下のために(int型私は1 =;私は<=カウント; I ++)
{
オブジェクトOBJ =新しいオブジェクト();
}
このような行為は、コピーObjectオブジェクトの参照カウントを持っているメモリにつながる多くを数えることができ、それはメモリのコストがあり、読むことをお勧めします。
オブジェクトOBJ = NULL;
以下のために(int型私は= 0; iが<=カウント; I ++)
{
OBJ =新しいオブジェクト();
}
この場合、唯一のメモリオブジェクトのオブジェクト・リファレンス、それぞれの新しいオブジェクト()場合、異なるオブジェクト何が、専用メモリ、大幅保存メモリ空間までのオブジェクトのオブジェクトの基準点。
(13)効率に基づいてチェック考慮配列を入力できない配列のサイズを決定するときのArrayListを使用して、可能な限り使用すべきです
(14)スレッドのセキュリティニーズがない限り、HashMapの、ArrayListを、StringBuilderのを利用するために、あるいはパフォーマンスのオーバーヘッドの使用につながった3つの同期メカニズムの後にハッシュテーブル、ベクトル、StringBufferのを、使用することはお勧めしません。
(15)のpublic static決勝として配列を宣言しないでください
これは無意味であるため、それだけで、最終的な静的ための基準を定義し、またはアレイの内容を自由に変更することができ、アレイは、アレイは、外部クラスにより変更することができることを意味する公共セキュリティの脆弱性、として宣言され
実施例の単一のケースを使用するために適した(16)
シングルトンは、負荷の負担を軽減負荷までの時間を短縮し、負荷の効率を改善するが、すべての場所が単一の場合に適していないことができ、簡単な言葉で、一つのケースは、主に以下の三つの側面に適用されます。
リソースへの同時アクセスを制御するために、スレッドの同期により、リソースの使用を制御
リソースを節約するために、制御例の生成
複数のプロセスまたは無関係なスレッド間の通信に、直接確立に関連しない条件下で、制御データを共有
(17)静的変数の任意の使用を避けるようにしてください
オブジェクトへの参照を静的変数として定義されているときには、知っている、そしてGC通常、ヒープメモリのようなオブジェクトによって占有され再利用されていません。
パブリッククラスA
{
プライベート静的BはB =新しいB();
}
アンインストールされていない場合、プログラムが終了するまで、同じクラスAのライフサイクルのこの静的変数bでは、クラスAは、次いで、B物体基準点Bは、永久的なメモリであろう
(18)タイムリーな除去セッションが不要になりました
セッションがあるが、もはやアクティブクリアするには、多くのアプリケーションサーバは、デフォルトのセッションタイムアウト時間、通常は30分を持っていません。より多くの会話を維持する場合は、アプリケーションサーバーの必要性、メモリ不足、オペレーティングシステムは、ディスクへのデータの一部を譲渡する場合、アプリケーションサーバは、MRUに基づくことができる(最近最も頻繁に使用される)アルゴリズムは、非アクティブなセッションの一部がディスクにダンプですさらにはメモリ例外を投げすることができます。セッションをディスクにダンプする場合、それは最初に直列化されなければならない、大規模なクラスタ、オブジェクトをシリアル化され、コストは非常に高価です。セッションが不要になったときしたがって、それは速やかに明確な会話にHttpSessionの無効()メソッドを呼び出してはなりません。
(19)インターフェイスのセットは、ランダム・ようなArrayListのを実装し、それが反復するループ代わりのforeachループの最も一般的な使用であるべきです
これは、JDKは、ユーザーにお勧めです。解釈RandomAccessインタフェース用JDKのAPIです:彼らは高速なランダムアクセスをサポートすることを示すために使用されるRandomAccessインタフェースを実現するために、このインタフェースの主な目的は、一般的なアルゴリズムはランダムまたはシーケンシャルアクセスリストに適用するために、自分の行動を変えることができるようにすることです良いを提供することができますパフォーマンス。実際の経験が示すランダム・インターフェース・クラス・インスタンス、foreachループを使用するためのより高いであろう通常のサイクル効率を使用してランダムアクセスする場合は、逆に、シーケンシャルアクセスの場合、より高い効率の使用はイテレータであろう。次のようなコードを決定することができます。
もし(ランダム・instanceofのリスト)
{
用(INT iは= 0; I <はlist.size(); I ++){}
}
そうしないと
{
<?>イテレータイテレータ= list.iterable();
一方、(iterator.hasNext()){iterator.next()}
}
基本原理を達成するためのforeachループはイテレータイテレータです。だから、言葉の後に反復するためのforeachループを使用して、クラスのインスタンスを順次アクセスすることを意味「逆に、それがシーケンシャルアクセスの場合、イテレータは高効率になります使用します」。
(20)別の同期方法シンクブロックを使用して