Javaコードを高速化し、プログラムのパフォーマンスを向上
19974 ワード
本稿では、コードを書くときに使うJAVAコードをより効率的にするためのテクニックを簡単に紹介します.
1.データベース接続、スレッドなどのシステムリソースをプールに配置する.Standaloneのアプリケーションでは、データベース接続プールは、C 3 P 0、proxool、DBPPなどのオープンソース接続プールを使用して実現することができ、コンテナで実行するアプリケーションでは、サーバが提供するData Sourceを使用することができる.スレッドプールはJDK自体が提供するjavaを使用することができる.util.concurrent.ExecutorService.
2ネットワークのオーバーヘッドを削減し、データベースやリモート・サービスと対話するときは、できるだけ複数回の呼び出しを1回の呼び出しに統合します.
3,頻繁にアクセスする外部リソースcacheをメモリに入れる、簡単にstaticのhashmapを使用してアプリケーション起動時にロードすることもできるし、OSCacheやEhcacheなどのオープンソースのcacheフレームワークを使用することもできる.リソースとの同期は、定期的なポーリングや外部リソースの更新時のアクティブな通知を考慮することができる.あるいは、自分で書いたコードにインタフェース(コマンド方式またはインタフェース方式)を残して手動で同期します.
4、IO操作を最適化し、JAVAがファイルを操作する際にInputStream and OutputStream、Reader and Writerの2種類に分け、streamの方式は速く、後者は主に文字を操作するために用いられ、文字がASCIIのみの場合にstreamの方式で効率を高めることができる.JDK1.4以降のnioはioよりも効率的です.
BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriterを使用して、ディスクへの直接アクセス数を削減します.
5頻繁にnewオブジェクトを使用するのではなく、アプリケーション全体に1つのインスタンスしか存在しないクラスに対して単例モードを使用する.Stringの接続操作には、StringBufferまたはStringBuilderを使用する.utilityタイプのクラスには静的メソッドでアクセスします.
6、誤った使用を避ける方法、例えばExceptionは方法の提示を制御することができるが、Exceptionはstacktraceの消費性能を保持し、必要がない限りinstanceofを用いて条件判断をしないで、できるだけ比の条件判断方式を用いる.JAVAの中で効率の高いクラス、例えばArrayListはVectorより性能が良い.
7,性能の考慮はシステム分析と設計の初めに考慮しなければならない.
要するに、一つのシステムの運行時の性能は、CPU、MemoryとIOの三つの主要な方面から最適化を考慮することにほかならない.不要なCPU消費を減らし、不要なIO操作を減らし、Memoryの利用効率を高める.
記事の内容は次のとおりです.http://developer.51cto.com/art/201206/342019.htm
1.データベース接続、スレッドなどのシステムリソースをプールに配置する.Standaloneのアプリケーションでは、データベース接続プールは、C 3 P 0、proxool、DBPPなどのオープンソース接続プールを使用して実現することができ、コンテナで実行するアプリケーションでは、サーバが提供するData Sourceを使用することができる.スレッドプールはJDK自体が提供するjavaを使用することができる.util.concurrent.ExecutorService.
- import java.util.concurrent.Executors;
- import java.util.concurrent.ExecutorService;
- public class JavaThreadPool {
- public static void main(String[] args) {
- ExecutorService pool = Executors.newFixedThreadPool(2);
-
- Thread t1 = new MyThread();
- Thread t2 = new MyThread();
- Thread t3 = new MyThread();
- Thread t4 = new MyThread();
- Thread t5 = new MyThread();
-
- pool.execute(t1);
- pool.execute(t2);
- pool.execute(t3);
- pool.execute(t4);
-
- pool.shutdown();
- }
- }
-
- class MyThread extends Thread {
- public void run() {
- System.out.println(Thread.currentThread().getName() + "running....");
- }
- }
2ネットワークのオーバーヘッドを削減し、データベースやリモート・サービスと対話するときは、できるだけ複数回の呼び出しを1回の呼び出しに統合します.
3,頻繁にアクセスする外部リソースcacheをメモリに入れる、簡単にstaticのhashmapを使用してアプリケーション起動時にロードすることもできるし、OSCacheやEhcacheなどのオープンソースのcacheフレームワークを使用することもできる.リソースとの同期は、定期的なポーリングや外部リソースの更新時のアクティブな通知を考慮することができる.あるいは、自分で書いたコードにインタフェース(コマンド方式またはインタフェース方式)を残して手動で同期します.
4、IO操作を最適化し、JAVAがファイルを操作する際にInputStream and OutputStream、Reader and Writerの2種類に分け、streamの方式は速く、後者は主に文字を操作するために用いられ、文字がASCIIのみの場合にstreamの方式で効率を高めることができる.JDK1.4以降のnioはioよりも効率的です.
- OutputStream out = new BufferedOutputStream(new FileOutputStream(new File("d:/temp/test.txt")));
- out.write("abcde".getBytes());
- out.flush();
- out.close();
BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriterを使用して、ディスクへの直接アクセス数を削減します.
- FileReader fr = new FileReader(f);
- BufferedReader br = new BufferedReader(fr);
- while (br.readLine() != null) count++;
5頻繁にnewオブジェクトを使用するのではなく、アプリケーション全体に1つのインスタンスしか存在しないクラスに対して単例モードを使用する.Stringの接続操作には、StringBufferまたはStringBuilderを使用する.utilityタイプのクラスには静的メソッドでアクセスします.
6、誤った使用を避ける方法、例えばExceptionは方法の提示を制御することができるが、Exceptionはstacktraceの消費性能を保持し、必要がない限りinstanceofを用いて条件判断をしないで、できるだけ比の条件判断方式を用いる.JAVAの中で効率の高いクラス、例えばArrayListはVectorより性能が良い.
7,性能の考慮はシステム分析と設計の初めに考慮しなければならない.
要するに、一つのシステムの運行時の性能は、CPU、MemoryとIOの三つの主要な方面から最適化を考慮することにほかならない.不要なCPU消費を減らし、不要なIO操作を減らし、Memoryの利用効率を高める.
記事の内容は次のとおりです.http://developer.51cto.com/art/201206/342019.htm