1.システムを最適化する前に知っておく必要はありません。
これはおそらく最も重要なパフォーマンスチューニングのヒントの一つです。あなたは一般的なベストプラクティスに従うと、効率的なユースケースを実装してみてください。しかし、これはあなたが必要なことを証明するまで、あなたが任意の標準ライブラリを交換したり、複雑な最適化を構築すべきであることを意味するものではありません。
ほとんどの場合、時期尚早の最適化は唯一の時間の多くを取ると読んで維持することが困難にコードをすることはありません。あなたはアプリケーションの非重要な部分を最適化するために多くの時間を費やすので、さらに悪いことに、これらの最適化は、通常、何か良いをもたらすものではありません。
それでは、どのようにあなたがここで何かを最適化する必要があることを証明するのですか?
まず、あなたがはるかに迅速にアプリケーションコードの速度を定義する必要があり、例えば、すべてのAPI呼び出しの最大応答時間を指定するか、インポートする特定の時間範囲内のレコードの数を指定します。これらが完了したら、アプリケーションのどの部分を改善するために遅すぎる必要性が何であるかを測定することができます。次に、2番目のスキルを見てください。
2.実際のボトルネックを見つけるために、プロファイラを使用
あなたが最初に提案し、アプリケーションの識別、特定の部分を実行した後に改善する必要があるので、どこから始めれば?
あなたは問題を解決するために2つのメソッドを使用することができます。
- あなたのコードをチェックして、不審なルックスから始めるか、それが問題の一部かもしれないと思います。
- あるいはアナライザを使用して、コードの各部分の動作とパフォーマンスに関する詳細情報を取得します。
私はあなたが常に第二の方法に従わなければならない理由を説明する必要がないことを願っています。
明らかに、アナライザの方法に基づいて、あなたがより良いコードのパフォーマンスへの影響を把握することができます、あなたが最も重要な部分に焦点を当てることができます。あなたはアナライザを使用している場合、あなたはあなたがパフォーマンスの問題を作成するコードのどの部分を見つける何に驚いどのくらい覚えておく必要があります。正直言って、私の最初の推測では、複数回間違った方向に私を導きました。
3.アプリケーション全体のパフォーマンス・テスト・スイートを作成します。
これは、あなたが頻繁に発生し、生産のパフォーマンスを向上させるために展開した後、多くの予期せぬ問題を避けるのを助けることができる別の一般的なヒントです。あなたは、常にアプリケーション全体のパフォーマンス・テスト・スイートのテストを定義し、パフォーマンスの改善前と後にそれを実行する必要があります。
これらの追加のテストランは、変更の副作用の機能と性能を特定し、それが良いの更新よりも害が発生しないことを確認するのに役立ちます。あなたは、データベースやキャッシュなどのアプリケーションの一部で使用されているさまざまなコンポーネントの数で作業する場合、これは特に重要です。
まず、最大のボトルネック工程
アナライザを使用したテストスイートおよび分析アプリケーションを作成した後、問題のパフォーマンスを向上させるために、対処する必要のシリーズを一覧表示することができます。それは大丈夫ですが、それはまだあなたが開始することであるべき質問に答えていません。あなたは、即効性のプログラムに焦点を当て、または最も重要な問題から開始することができます。
あなたはすぐに最初の結果を表示することができますので、クイックスタート・プログラムは、非常に魅力的であるかもしれません。しかし、時には、あなたが他のチームメンバーや管理を説得する必要があるかもしれないパフォーマンス分析はそれだけの価値があると信じている - 効果を見ていないので。
しかし、一般的に、私は最も重要な性能上の問題から始まるお勧めします。これは、最大のパフォーマンス向上を提供します、そして、もはや性能要求を満たすために、これらの問題の一部を解決する必要がないかもしれません。
この目的のために一般的なパフォーマンスチューニング手法。のは、Javaでの具体的な手法のいくつかを詳しく見てみましょう。
5.文字列のStringBuilderはプログラム的に接続されています
JavaのStringに接続するために、さまざまなオプションがあります。たとえば、シンプル+または+ =、およびStringBufferのかのStringBuilderを使用することができます。
だから、どの方法を選ぶべきなのでしょうか?
答えは、接続文字列のコードに依存します。あなたがのためにループ内で例えば、文字列プログラミングモードに新しいコンテンツを追加している場合は、StringBuilderのを使用する必要があります。使いやすく、StringBufferのよりも優れたパフォーマンスを提供しています。しかし、StringBufferのに比べて、StringBuilderのは、スレッドセーフではなく、すべてのユースケースに適していないかもしれない、覚えておいてください。
あなただけのインスタンスとStringに新しいセクションを追加するために新しいのStringBuilder appendメソッドを呼び出す必要があります。あなたはすべての部品を追加した後、あなたは文字列の接続を取得するには、toString()メソッドを呼び出すことができます。
次のコードは、簡単な例を示しています。各反復中、ループiが文字列に変換され、そしてStringBuilderのSB内の空間でそれに加えました。したがって、最終的に、コードは、ログファイル「これはTEST0 1 2 3 4 5 6 7 8 9」に書き込まれます。
StringBuilderのSB = 新しい StringBuilderの(「これはあるテスト」); 以下のために(int型 i = 0 ; iは< 10 ; iは++ ){ sb.append(i)を、 sb.append(」「); } log.info(sb.toString())。
上記コードフラグメントに見られるように、あなたは、コンストラクタに文字列の最初の要素を提供することができます。これは、新規のStringBuilder、容量および提供16個の余分な文字を含む新しいStringBuilderの文字列を作成します。あなたはStringBuilderのに複数の文字を追加すると、JVMは、動的にStringBuilderのサイズが大きくなります。
あなたはすでにあなたの文字列の文字数が含まれています知っている場合、それはStringBuilderのは、定義された能力を持ってインスタンス化するために別のコンストラクタに番号を提供することができます。それはその容量の動的拡張を必要としないので、これはさらに、効率を向上させることができます。
6.接続声明+文字列を使用します
あなたが最初のアプリケーションを実現するためにJavaを使用すると、あなたは文字列+に接続する必要はありませんと言われている可能性があります。アプリケーション・ロジック内の接続文字列であれば、それはそうです。ストリングが接続され、各列の結果は、新しい文字列オブジェクトに格納され、不変です。これは、追加のメモリを必要とし、それはあなたがループ内の単語の複数の文字列を接続する場合は特に、あなたのアプリケーションが遅くなります。
これらの例では、5つのヒントに従うとのStringBuilderを使用する必要があります。
複数の行に、あなただけの文字列は、コードの可読性を改善するために、しかし、もし、それはそうではありません。
クエリq = em.createQuery(「a.id SELECT、a.firstName、a.lastName」 + 「著者からの」 +「WHERE a.id = ID」)。
これらのケースでは、あなたの文字列を接続するための単純な+でなければなりません。Javaコンパイラは、コンパイル時にこの最適化し、接続を行います。そのため、実行時に、あなたのコードは、接続する必要はありません、文字列を使用します。
プリミティブとして7.
任意のオーバーヘッドと他のプログラムのパフォーマンスアプリケーション改善するための簡単かつ迅速な方法を避けることは、そのパッケージではなく、基本的なタイプを使用することです。代わりにダブルダブルを使用しての代わりに、整数のため、最善の使用はint、。これは、JVMの可能スタックの代わりにメモリ消費量を低減するヒープに格納された値、およびより効果的な治療を。
8. BigIntegerのとはBigDecimalを避けるようにしてください
我々は、データの種類について話しているので、我々は簡単に見たBigIntegerとBigDecimalのそれを取ります。特に、その精度の後者と誰もが歓迎しました。しかし、これは価格で来ます。
BigIntegerのとBigDecimalのは、単純なロングまたは倍以上のメモリを必要とし、大幅にすべての計算を遅くすることができます。あなたは余分な精度を必要とする、または番号が長い範囲を超えてしまうのであれば、それは二度考えるのがベストです。これは、数学的アルゴリズムを実装する場合は特に、あなたが、変更する必要があるパフォーマンスの問題を解決する唯一の方法かもしれません。
まず、現在のログレベルをチェック
この提案は明らかであるが、残念ながら、多くのプログラマが書いたコードは、ほとんどがそれを無視します。あなたがデバッグメッセージを作成する前に、必ずとは、最初に、現在のログレベルをチェックする必要があります。そうしないと、ログを作成することがありますがメッセージ文字列の後に無視されます。
2つの負の例があります。
// これ行わない log.debug(「ユーザー[」+ userNameに+「]でメソッドのXと呼ばれるが、[」+ I + 「]」); // またはこの log.debug(ユーザ名、I)String.Formatの(「[%のD]とユーザ[%S]と呼ばれる方法X」)。
上記の両方のケースでは、ロギングフレームワークは、ログメッセージの前提を使用するかどうかを知らなくても、ログメッセージを作成するために必要なすべての手順を実行します。だから、デバッグメッセージを作成する前に、それは現在のログレベルをチェックすることをお勧めします。
// これを行う 場合(log.isDebugEnabled()){ log.debug(「ユーザー[」 + userNameに+「]と呼ばれる方法をX [」+ I + 「]」); }
10. String.replace代わりにApache CommonsのStringUtils.Replace
一般に、String.replace方法は、特にJavaの9を使用する場合には、微細な、高効率に動作します。アプリケーションが交換作業の多くを必要としない、とJavaの最新バージョンへのアップデート場合は、その後、我々はまだ、より速く、より効果的な代替手段を見つける必要があります。
代替の答えはApache CommonsのラングのStringUtils.replaceの方法があります。彼の最近のブログ記事でルーカスエダーが説明したように、StringUtils.replace方法は、Java String.replaceメソッド8よりもはるかに優れています。
そして、それはわずかな変更を必要とします。それはすべての呼び出し、アプリケーションにはApache Commonsのラングプロジェクトのpom.xml Mavenの依存関係を追加し、StringUtils.replace方法についてString.replace方法を交換してください。
// この置き換え test.replace(「テスト」、「簡単なテストを」); // これで StringUtils.replace(テスト、「テスト」、「簡単なテスト」);
データベース接続など11キャッシュの高価な資源、
キャッシュは、繰り返しコードや人気のあるソリューションの高価な作品の実行を回避するために使用されます。一般的な考え方は単純で、繰り返し新しいリソースを作成するよりも安くなるために、これらのリソースを再利用します。
典型的な例では、データベース接続プールのキャッシュです。新しい接続を作成すると、既存の接続を再利用する場合は、あなたがこのような状況を避けることができ、時間がかかります。
また、Java言語自体の他の例を見つけることができます。例えば、-128と127の間の整数値をキャッシュするためのvalueOfメソッド。最も一般的に使用される値のキャッシュは、パフォーマンス上の利点を提供できるようにするには、新しい整数を作成することは、あまりにも高価ではないと言うかもしれないが、それはしばしば使用されるため。
あなたはキャッシングを考えると、しかし、キャッシュの実装はオーバーヘッドが生成されます覚えています。あなたは廃止されたリソースを使用すると、リソースにアクセスできるようにキャッシュを管理する必要があるかもしれませんので、再利用可能な資源を保存するために余分なメモリを費やし、および削除する必要があります。
あなたが任意のキャッシュ・リソースを開始する前に、あなたは十分に、よりそれらを使用しなければならないことを、キャッシュの実装はそれだけの価値があることを確認してください。
概要
あなたが見ることができるように、時にはそれはあなたのアプリケーションのパフォーマンスを向上させることができます多くの作業を必要としません。この記事のアドバイスの多くは、あなたのコードに適用することができる唯一の少しの努力が必要です。
しかし、どのようなプログラミング言語のスキルとは何の関係もない最も重要なこと:
- あなたが知っている必要があります前に、最適化しないでください
- 本当のボトルネックを見つけるために、プロファイラを使用
- まず、最大のボトルネック工程