かつのりの日記2

わんくまでは珍しいJavaを中心とした日記です

目次

Blog 利用状況

書庫

日記カテゴリ

いろいろリンク

2chのJavaネタ

[Java SE 7] 次世代Javaの動向 5 [dolphin]

JDK7が開発中ですが、色々と面白い議論があるスレッドです。この中で面白かったのが、ライトウェイトな例外。例外処理は重いので軽い例外が欲しいという話です。発端としてはInteger.parseIntなんですが、「数値化できないときに非チェック例外をスローするのはどうよ?例外って重いし。」ってところからです。

例外処理は一般的に重い処理といわれていますが、実際にどのフェーズが重いのかはっきりと分かっている人が少ないと思います。そこで検証してみました。自分の中ではthrowが重いと思っていたのですが、実際には違いました。

10,000,000回ループでそれぞれstaticメソッドコールのみ、軽い例外のスロー、通常の例外のスローの時間を計測しました。5回試した平均からいうと、それぞれ9ms、1675ms、9815msでした。throwが決して軽い処理ではありませんが、明らかに比重として重いのは例外のスローよりも例外の生成です。

上記コードでも分かると思いますが、fillInStackTraceが重いわけですが、このメソッドは必ずコンストラクタで呼ばれるのです。new Throwable()だけで現在のスタックが取得できるのはこのためです。これが重いといわれる原因なのです。

クリティカルで速度が要求される場面での数値チェックは、例外を使わないのが無難っぽいです。

 

投稿日時 : 2007年9月7日 0:46

Feedback

# re: 2chのJavaネタ 2007/09/07 9:36 凪瀬

ところで、コンパイル時にclassファイルにトレース用の行番号テーブル持たせない場合は速度どうなりますか?
行数不明なだけでトレースは作られるから速度は変わらないのかな?

# re: 2chのJavaネタ 2007/09/07 9:54 かつのり

行番号やファイル名を持たせないのは試していないですが、
あらかじめ用意している例外をスローするだけなら、
同じ条件で900msくらいでした。

throw自体はやはり例外の生成に比べて全然軽いようです。

# re: 2chのJavaネタ 2007/09/09 11:54 なちゃ

new LightWeightException();
だけと
new NormalException();
だけも入れたらもそっと見えるかも。

# re: NETのObjectのトレーサビリティ 2007/09/10 13:04 むらぶろ - .NETって面白い -

re: NETのObjectのトレーサビリティ

タイトル
名前
Url
コメント