Javaのパフォーマンスチューニング11の実用的なヒント

最適化を行うために必要な前に1、

これはおそらく最も重要なパフォーマンスチューニング技術の一つです。あなたは一般的なベストプラクティスに従うと、効果的にあなたのユースケースを実装してみてください。しかし、それは必要である前に、それが証拠を意味するものではありません、任意の標準ライブラリを交換したり、複雑な最適化を構築します。

ほとんどの場合、時期尚早の最適化は、読んで維持するために、コードを困難に、多くの時間を要します。あなたはアプリケーションの非重要部品の最適化に多くの時間を費やすので、さらに悪いことに、これらの最適化は、通常、何か良いをもたらすものではありません。

それでは、どのようにあなたが特定の物事を最適化する必要があることを証明するのですか?

まず、あなたがアプリケーションコードの速度を決定する必要があり、例えば、すべてのAPIは、特定の期間に指定された最大応答時間、または指定された数のレコードを呼び出します。一度行って、あなたは遅すぎるし、改善する必要があるアプリケーションのどの部分を測定することができます。その際、第2の同調のヒントをお読みください。

2.実際のボトルネックを見つけるために、プロファイラを使用

あなたの後の最初の提案に従ってください、そして、あなたのアプリケーションの特定の部分が改善を必要とするん識別するために、どこから始めれば自問してみてください?

あなたはこの問題を解決するために2つのメソッドを使用することができます。

あなたは不審なルックスから始まる、あなたのコードを見ることができますか、それが問題の一部かもしれないと思います。

またはコード取得の各部分の分析、行動及び性能の詳細を使用。

あなたは常に第二の方法に従わなければならない理由について。

その答えは、アナライザの方法に基づいて、明らかであるあなたがより良いコードのパフォーマンスへの影響を理解することができます、あなたが最も重要な部分に集中することができます。あなたは今までアナライザを使用している場合は、パフォーマンス上の問題を引き起こしてどのようなコードの一部で驚かれることでしょう。しかし、多くの時間が、あなたの最初の推測は間違った方向に導いてくれる。

 

3.アプリケーション全体のパフォーマンス・テスト・スイートを作成します。

これは、あなたが多くの予期しない問題を避けるための別の一般的なヒントで、これらの問題は通常、パフォーマンスを向上させるために、本番環境への展開後に発生します。あなたは、常にパフォーマンス・テスト・スイートの定義のアプリケーション全体をテストし、あなたの完全なパフォーマンスの改善前と後にそれを実行する必要があります。

これらの追加のテストランを使用すると、変更が機能と性能に影響を与える識別するのに役立つ、とあなたは良いよりも害を更新放出しないことを確認します。あなたのタスクは、特に重要であるデータベースやキャッシュ、などのアプリケーションの多くの異なる部分を実行する場合。

まず最大のボトルネックを解消

アプリケーションの分析のためのアナライザを使用してテストスイートを作成した後、あなたが質問のリストを持っていますそれは大丈夫です、パフォーマンスを改善する必要があるが、それはまだあなたが開始することであるべき質問に答えていません。また、開始またはすばやく最も重要な問題から得ることができる人たちから始めることができます。

それはすぐに結果になりますので、もちろん、前者は、非常に魅力的です。時には、あなたが他のチームメンバーや自分の管理を説得する必要がある場合があり、パフォーマンス分析は、それだけの価値があります。

しかし、一般的に、私は最も重要なパフォーマンスの問題に取り組むすべての最初のをお勧めします。これは、最大のパフォーマンスの向上を提供します、そしてあなたは、あなたのパフォーマンス要件を解決することができ、これらの問題の一部を修正する必要があるかもしれません。

一般的なパフォーマンスチューニングのヒントの理解では、のは、Javaの上のいくつかの具体的なチューニングのヒントを詳しく見てみましょう。

5. StringBuilderの文字列をプログラムに接続されています

Javaでの接続文字列のためのさまざまなオプションがあります。例えば、単純な+や+ =、または古いのStringBufferのStringBuilder。

だから、どの方法を選ぶべきなのでしょうか?

答えは、コード内の接続文字列に依存します。あなたがループのために、例えば、プログラムで文字列に新しいコンテンツを追加する場合は、StringBuilderのを使用する必要があります。これは、StringBufferをより使いと優れたパフォーマンスを提供する方が簡単です。しかし、StringBufferのと違うのStringBuilderを覚えて、それはスレッドセーフではなく、すべてのユースケースに適していないかもしれません。

あなただけの新しいStringBuilderのをインスタンス化する必要があり、文字列内の新しいセクションを追加するためにappendメソッドを呼び出します。あなたはすべての部品を追加するときは、接続文字列を取得するには、toString()メソッドを呼び出すことができます。

次のコードは、簡単な例を示しています。ログファイルに「これはtest0123456789です」最後に、このコードが書かれているので、各反復では、サイクルiは文字列に変換され、そして宇宙のStringBuilder SBに追加します。

StringBuilderのSB =新しいStringBuilderの(「これはテストです」); 
(I 0 = int型、iが10 <; Iは++){ため
sb.append(I)。
sb.append(」「);
}
log.info(sb.toString())。

コードセグメントに見られるように、次のコンストラクタメソッドへの文字列の最初の要素を提供することができます。これは、容量と提供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を見てみましょう。その高い人気の精度に起因し、特に後者。しかし、これは価格で来ます。

BigDecimalをBigIntegerのとシンプルなロングまたは倍以上のメモリを必要とし、大幅にすべての演算速度を下げます。だから、あなたは余分な精度を必要とする、またはあなたの姿が長いの範囲を超えた場合に、より優れた二回だと思います。これはおそらく、あなたが数学的アルゴリズムを実装している場合は特に、問題のパフォーマンスを向上させるために変更する必要がある唯一の場所です。

まず、現在のログレベルをチェック

このアドバイスは明白ですが、残念ながら、あなたはそれを無視するコードの多くを見つけることができます。デバッグメッセージを作成する前に、現在のログレベルをチェックする必要があります。

ここではあなたがそれを行うべきではないことを示すために2つの例を示します。

//これ行わない
log.debug(「ユーザー[」+ userNameに+「]でメソッドのXと呼ばれるが、[」+ I +「]」);
//またはこの
log.debug(ユーザ名、I)String.Formatの(「[%のD]とユーザ[%S]と呼ばれる方法X」)。

どちらの場合も、あなたは、ロギングフレームワークのログメッセージを使用するかどうかを知らない、ログメッセージを作成するために必要なすべての手順を実行します。デバッグメッセージを作成する前に、それは現在のログレベルをチェックすることをお勧めします。

//これを行う
場合(log.isDebugEnabled()){
log.debug(「ユーザー[」+ userNameに+「]と呼ばれる方法をX [」+ I +「]」);
}

10の代わりにApache CommonsのStringUtils.Replace String.replaceを使用して

一般的には、String.replaceメソッドは、Java 9を使用している場合は特に、うまく機能し、非常に効率的。ただし、アプリケーションが交換作業の多くを必要とし、あなたは、Javaの最新バージョンに更新していない場合は、より早くチェックして、より効果的な代替手段はまだ意味があります。

 

これは、候補者はApache CommonsのラングのStringUtils.replace(https://commons.apache.org/proper/commons-lang/)メソッドです。ルーカス・エダーはで彼の最近のブログ記事(https://blog.jooq.org/2017/10/11/benchmarking-jdk-string-replace-vs-apache-commons-stringutils-replace/)で説明したようにそれは非常にJavaのString.replaceメソッド8を超えて。

これは、わずかな変更を必要とします。あなたは、あなたのアプリケーションのpom.xmlにMavenの依存関係を追加し、すべてのString.replace方法StringUtils.replaceメソッド呼び出しを置き換えるためにApacheのCommonsのラングプロジェクトに必要です。

//この置き換え
test.replace(「テスト」、「簡単なテストを」);
//これで
StringUtils.replace(テスト、「テスト」、「簡単なテスト」);

データベース接続など11キャッシュの高価な資源、

キャッシングは繰り返し行わ高価なまたは頻繁に使用されるコードの断片を回避するための一般的なソリューションです。一般的な考え方は単純です:新しいリソースを作成するために何度も何度も繰り返しよりも、これらのリソースの使用がはるかに安いです。

典型的な例は、キャッシュデータベース接続プールです。新しい接続を作成して再利用する既存の接続を回避できるのであれば、時間がかかります。

また、Java言語自体の他の例を見つけることができます。例えば、-128と127の間の整​​数値をキャッシュするためのvalueOfメソッド。あなたはあまりにも高価ではありませんが、それは多くの場合、最も一般的に使用される値は、パフォーマンス上の利点を提供するキャッシング、使用される新しい整数を作成し、言うかもしれません。

あなたは覚えて、キャッシングを考えるときには、キャッシュ実装は、オーバーヘッド生成されます。あなたは廃止されたリソースにアクセスするためのリソースを有効にするか、または削除するために、あなたのキャッシュを管理する必要があるかもしれませんので、再利用可能な資源を保存するために余分なメモリを過ごす、とする必要があります。

あなたが任意のキャッシュ・リソースを開始する前に、頻繁に使用されていることを確認してください。

おすすめ

転載: www.cnblogs.com/xuyiding/p/11621903.html