throw Exceptionの実行効率試験

3681 ワード

現在メンテナンスされているプロジェクトをExceptionでエラーを処理するよう説得するために、異常効率なデータを作成します.ああ......
  • テストコード
  •  
            /**
             *  
             * @throws Exception
             */
            @Test
            public void testThrowEfficiency() throws Exception {
                    long times = 1000000;
                    long startTime;
                    System.out.println(times + " ");
    
                    try {
                            recursion(0, true);
                    }
                    catch (Exception e) {
                            System.out.println(" :" + e.getStackTrace().length);
                    }
    
                    for(int count = 0; count < 10; count++) {
                            startTime = System.currentTimeMillis();
                            for (int i = 0; i < times; i++) {
                                    try {
                                            recursion(0, true);
                                    }
                                    catch (Exception e) {
                                    }
                            }
                            System.out.println(" :" + (System.currentTimeMillis() - startTime));
                            
                            startTime = System.currentTimeMillis();
                            for (int i = 0; i < times; i++) {
                                    try {
                                            recursion(0, false);
                                    }
                                    catch (Exception e) {
                                    }
                            }
                            System.out.println(" :" + (System.currentTimeMillis() - startTime));
                    }
            }
            
            private void recursion(int count, boolean isThrow) {
                    if(count == 10) {
                            if(isThrow) {
                                    throw new IllegalStateException("");
                            }
                            return;
                    }
                    recursion(count+1, isThrow);
            }
            
            public static void main(String[] args) throws Exception {
                    Test test = new MakeKeyNoTest();
                    test.testThrowEfficiency();
            }
    
    

     
  • 試験機器:
  • cpu:CeleronM CPU [email protected] GHz(私の可哀想な機械・・・)
    メモリ:2 GB
  • テスト結果:(時間:ミリ秒)
  •  
    BODY { FONT-FAMILY:Tahoma; FONT-SIZE:10pt } P { FONT-FAMILY:Tahoma; FONT-SIZE:10pt } DIV { FONT-FAMILY:Tahoma; FONT-SIZE:10pt } TD { FONT-FAMILY:Tahoma; FONT-SIZE:10pt }
    100000サイクルテスト異常スタック深さ:13異常あり:2766なし:47異常あり:2890なし:47異常あり:2719なし:47異常あり:2718なし:47異常あり:2688なし:47異常あり:2718なし:47異常あり:2718なし:47異常あり:2703なし:32異常あり:2672なし:63異常あり:2703なし:47異常あり:2703なし:31
    100000サイクルテスト異常スタック深さ:23異常あり:3688なし:94異常あり:3593なし:94異常あり:3625なし:94異常あり:3625なし:94異常あり:3625なし:78異常あり:3922なし:94異常あり:5625なし:437異常あり:8469なし:94異常あり:4390なし:94異常あり:3594なし:109異常あり:3610なし:93
    100000サイクルテスト異常スタック深さ:33異常あり:5328なし:141異常あり:5109なし:125異常あり:5109なし:157異常あり:5093なし:141異常あり:12563なし:125異常あり:5125なし:125異常あり:5218なし:125異常あり:5172なし:141異常あり:5125なし:140異常あり:5204なし:125
    100000サイクルテスト異常スタック深さ:53異常あり:6172なし:234異常あり:6063なし:219異常あり:6031なし:234異常あり:6094なし:234異常あり:6078なし:219異常あり:6047なし:219異常あり:6062なし:235異常あり:6031なし:250異常あり:6156なし:235異常あり:6062なし:234
     
    結果分析:
  • スタック深さは速度に大きな影響を及ぼし,実質的に線形成長を示した.
  • 13層のスタック深さの場合、約2.7秒かかり、異常毎に2.7微妙に換算され、普通の機械は毎秒37万回異常を放出することができる.

  • 異常な効率は私が以前想像していたよりも高い.