ソフトウェアシステムのパフォーマンスボトルネックの真相


テストを見てください.
1、100回すばやく並べ替えて、並べ替えに必要な時間を計算します.
public QuickSort() {  

        long beginTime = System.nanoTime();  

        // 100   

        int b[]=a.clone();  

        for(int i=0;i<100;i++){  

            quick(b);  

        }  

        long total = System.nanoTime() - beginTime;  

        //18133  

        System.out.println(" :" + total/100);  

    }  

私の機械では、大体の時間は:
小配列の高速ソートに要する平均時間:18133
 
 
2、計算はシステムを使用する.out.println文字列の印刷に使用する時間:
public static void main(String[] args) {  

        long beginTime = System.nanoTime();  

        for(int i=0;i<100;i++){  

            System.out.println("hello World");  

        }  

        long total = System.nanoTime() - beginTime;  

        /** 

         * 18214 

         */  

        System.out.println(" IO :" + total/100);  

    }  

印刷時間は次のようになります.
平均ディスクIO時間:18334
 
 
3、ローカルエリアネットワークのマシンからデータを取得するのに要する時間を記録し、仮想マシンのmemcachedをテスト対象とします.
public class MemcachedTest {  

    private MemcachedClient memCachedClient ;  

    MemcachedTest() throws IOException{  

        memCachedClient = new MemcachedClient(  

                new InetSocketAddress("192.168.1.103", 11211));  

    }  

      

    public static void main(String[] args) throws IOException {  

        new MemcachedTest().test();  

    }  

  

    private void test() throws IOException {  

        long beginTime = System.nanoTime();  

        for(int i=0;i<100;i++){  

            memCachedClient.get("dfsdf" + i);  

        }  

        long totalTime = System.nanoTime()-beginTime;  

        // , , :516486  

        System.out.println(" memcached :" + (totalTime/100));  

    }  

}  

印刷時間:
ローカルエリアネットワークのmemcachedから1回のデータを取得するのに要する平均時間:528065
 
実はテスト1はコンピュータの最も得意な操作で、通常この操作はコンピュータのメモリで行って、テスト2の操作は実は1つのIOの操作で、1つのグラフィックスカードにデータを書くIOに関連して、第3の操作、実は1つのネットワークIOで、コンピュータはネットカードに1つの命令を送って、別の機械に命令を受信して、最後に更にネットカードから結果を読みます.
最後に、各時間には次のような関係があります.
ディスクIO≒1/29 memcachedの高速ソートに要する時間.
 
システムでIOが発生すると、直接操作メモリよりも数百倍遅い時間がかかることがわかります.高速ソートでは、数百回のデータ移動と比較が行われるためです.ネットワークを介した操作では、通常、ディスクよりも少なくとも1桁遅い速度になります.
 
現在、様々な分散製品が流行しているにもかかわらず、これらの基礎常識は、効率的で安定性の高いソフトウェアを書くことができることを心に刻まなければならない.次に、私がまとめたコードのいくつかのパフォーマンスに関するガイドラインを示します.
一、メモリで解決できるものはできるだけディスクにアクセスしないで、本機のディスクで解決できるものは、できるだけネットワークにアクセスしないでください.
二、マルチスレッド同時アクセスプログラムでは、データを共有しないでできるだけ共有しないことができる(StringBuilderはStringBufferより優れている).コンカレントツールクラス(Atomic関連クラス、ConcurrentHashMap、CASなど)を使用できる場合は、synchronizedはなるべく使用しないでください.
三、データベースにアクセスする時、よく使うクエリー条件に対して必ず複合インデックスを作成しなければならない.ソートしないでできるだけソートしないでください.ソートが必要な場合は、クエリー時にソートフィールドを計算しないで、ソートフィールドを事前に保存してください.
四、ロットは単一操作より優れており、多くの製品、例えばデータベース、memcachedなどは、ロットと単一操作がある.一部のタスククラスでは、一括操作が可能な場合は、一括インタフェースが優先されます.
五、ユーザーが大きなファイルをエクスポートするなど、計算時間が長い操作は、できるだけ最適化します.システムにこのような操作が必要である場合は、キューを使用してこれらの問題を専門に解決し、システムスレッドの数を制御する必要があります.
 
また、プロジェクトでは、ほとんどのシステムのボトルネックがデータベースにある可能性があります.通常、1つのシステムのユーザーが1 wを超えると、キャッシュが必要になります.実際、パフォーマンスの問題は、コードレベルだけでなく、apacheのデフォルト構成など、ミドルウェア上で発生する可能性があります.大きな同時システム、mysqlのキャッシュ、oracleの最大接続数など、前段のJSのロードや実行には非常に適していません.一部のミドルウェアに精通しており、システムのパフォーマンスとスループットを向上させることができます.
 
通常、パフォーマンスはユーザーが使用している間に発見されるため、問題のトラブルシューティングは困難です.彼の話題については、何冊もの本を書いても書ききれない.ここでは、タイトルが大げさだが、ソフトウェアのIOがシステムのボトルネックの重要な原因であることは疑いの余地がない.
 
 
このような話題に興味がありますか?へようこそ
[email protected]
私について:邯鄲人、Java、Javascript、Extjs、oracle sqlが得意です.
もっと私の前の文章、訪問することができます
マイスペース