8

プログラムを実行するときにcatchブロックに入るとかなりのコストがかかることは知っていますが、try {}ブロックに入るのも影響があるのではないかと思ったので、Googleで多くの意見を持って答えを探し始めましたが、ベンチマークはありませんでした。すべて。私が見つけたいくつかの答えは次のとおりです。

  1. Javaのtry/catchパフォーマンス、try句内の内容を最小限に抑えることをお勧めしますか?
  2. CatchPerformanceJavaをお試しください
  3. Javaはブロックをキャッチしようとします

しかし、彼らは私の質問に事実で答えなかったので、私はそれを自分で試してみることにしました。

これが私がしたことです。この形式のcsvファイルがあります:

host;ip;number;date;status;email;uid;name;lastname;promo_code;

ステータスの後のすべてはオプションであり、対応する;もありません。したがって、値が存在するかどうかを確認するために検証を解析する必要がある場合、ここでtry/catchの問題が頭に浮かびました。

私が会社で継承した現在のコードはこれを行います:

StringTokenizer st=new StringTokenizer(line,";");  
String host = st.nextToken();
String ip = st.nextToken();
String number = st.nextToken();
String date = st.nextToken();
String status = st.nextToken();                             
String email = "";
try{
    email = st.nextToken();
}catch(NoSuchElementException e){
    email = "";
}

そして、uid、name、lastname、promo_codeを使用して電子メールに対して行われたことを繰り返します。

そして私はすべてを次のように変更しました:

if(st.hasMoreTokens()){
    email = st.nextToken();
}

実際、パフォーマンスは高速です。オプションの列がないファイルを解析する場合。平均時間は次のとおりです。

 --- Trying:122 milliseconds
 --- Checking:33 milliseconds

ただし、混乱した理由と質問の理由は次のとおりです。CSVの8000行すべてでオプションの列の値を使用して例を実行すると、if()バージョンのパフォーマンスがtry / catchバージョンよりも優れているため、私の質問です。は

本当にtryブロックは私のコードにパフォーマンスの影響を与えませんか?

この例の平均時間は次のとおりです。

--- Trying:105 milliseconds
--- Checking:43 milliseconds

誰かがここで何が起こっているのか説明できますか?

どうもありがとう

4

1 に答える 1

12

はい、(Java で) try を実行してもパフォーマンスに影響はありません。コンパイラは、try ブロックの VM ステートメントを生成しません。これは、try ブロックがアクティブなプログラム カウンターを記録し、この情報をクラス ファイルのメソッドに添付するだけです。次に、例外がスローされると、VM はスタックをアンワインドし、各フレームで、そのフレームのプログラム カウンターが関連する try ブロックにあるかどうかをチェックします。これは (スタック トレースの構築と合わせて) 非常にコストがかかるため、キャッチにはコストがかかります。ただし、試すのは無料です:)。

それでも、通常の制御フローに例外を使用することはお勧めできません。

あなたのコードがより高速に実行される理由は、おそらく、キャッチが非常にコストがかかり、チェックを単純な試行に置き換えることによって節約される時間を上回っているためです。

try catch は、catch があまり頻繁にトリガーされないコードで高速になる可能性があります。それでも、これは良いスタイルではなく、より多くのトークンを明示的にチェックする方法が優先されます。

于 2012-06-11T10:40:04.520 に答える