• 検索結果がありません。

setjmp 法と 2 返戻値法の比較

ドキュメント内 言語への変換による (ページ 97-102)

第 6 章 例外処理の実現

6.3 評価

6.3.3 setjmp 法と 2 返戻値法の比較

ンタプ リタから静的コンパイル済みコード を呼び出す回数( 表6.3の,例外処理変換部で

最適化なし の場合にenterTry()を実行する回数)自体が少ないためだと考える.

setjmp()の利用

図6.6から, setjmp()longjmp()の代わりにsetjmp()longjmp()を使うと相乗

平均で0.70%実行速度が低下することが判る.特に 213 javac228 jackの2項目につ

いては,それぞれ1.5%2.6%と大きな影響が出ているが,表6.3から,これらのベンチ

マーク項目ではtryEnter()マクロ,すなわちsetjmp()の実行頻度が高いことが 判り,

測定結果が偶然ではないといえる.相乗平均で0.70%という数値は単一の最適化から生じ る影響としては必ずしも小さくなく,OS setjmp()に相当する機能を提供する場合に は,setjmp()に替えて setjmp()を利用することが望ましいと考える.

6.3.2 2

返戻値法向け最適化の評価

ここでは本論文で提案した2返戻値法向け最適化である,下方移動による例外発生検査 の除去あるいは集約が実行速度に与える影響を評価する.2返戻値法向け最適化には,他 に インライン展開と手続間解析による冗長な例外発生検査の除去があるが,これらは評価 対象から除外する.前者を除外する理由は,インライン展開そのものが 実行速度にあたえ る影響から例外発生検査の除去のみが実行速度に与える影響を単離することが困難である ためである.後者を除外する理由は,効果がなかったからである.

下方移動による例外発生検査の除去あるいは集約

例外発生検査の下方移動による除去あるいは集約が実行速度に与える影響を評価した結 果を図6.7に示す.評価は最適化を実施した場合を基準とし て最適化を適用しなかった場 合に実行速度がどれだけ低下するか測定することでおこなった.図6.7の縦軸は実行速度

の低下率を表し ,横軸は測定対象のベンチマーク項目名を表す.図6.7から,最適化を適

用しないと実行速度が相乗平均で0.96%低下することが 判り,下方移動による最適化があ る程度有用であるといえる.

‡‡

‰‰

ŠŠ

‹‹

Ç`/M

Ç`/-ˆˆ

„ˆ„ˆ

¶¶‰‡ˆ‰‡ˆ¶¶ººÆÆÄÄÇɼÊÊÇɼÊÊ

¶¶‰‡‰‰‡‰¶¶ÁÁ¼ÊʼÊÊ

¶¶‰‡‰‡¶¶»¹»¹

¶¶‰ˆŠ‰ˆŠ¶¶ÁÁ¸¸Í͸º¸º

¶¶‰‰‰‰‰‰¶¶ÄǼ¾¸Ì»ÄǼ¾¸Ì»

ÀÀÆÆ

¶¶‰‰Ž‰‰Ž¶¶ÄËÄËÉÉËË

¶¶‰‰‰‰¶¶ÁÁ¸¸ººÂ ç ç$$

”®|

”®|™™··jÄáá

IIBB Ðи¸¨¨¡¡{{MM”‡|”‡|€€

図6.7: 例外発生検査の下方移動が実行速度に与える影響



ˆˆ‡‡ˆˆ

ˆˆ‡‡‰‰

ˆˆ‡‡ŠŠ

IIBB §§Êʼ˼ËÁÁÄÄÇÇ::””ˆ‡ˆ‡‡‡|€|€

ˆˆ‡‡‡‡

ʼËÁÄÇ:

ò¯o:

ù»

ʼËÁÄÇ: £Ç|1µ£UK)íۀ

ù»

‡‡

”®|™”®|™··jÄáá

¶‰¶‰‡‡ˆ¶ˆ¶ººÆÆÄÄÇÇɼɼÊÊÊÊ

¶‰¶‰‡‡‰¶‰¶ÁÁ¼Ê¼ÊÊÊ

¶‰¶‰‡‡¶¶»¹»¹

¶‰¶‰ˆˆŠ¶Š¶ÁÁ¸¸Í¸Í¸ºº

¶‰¶‰‰‰‰¶‰¶ÄǼÄǼ¾¾¸Ì»¸Ì»ÀÀÆÆ

¶‰¶‰‰‰Ž¶Ž¶ÄËÉËÄËÉË

¶‰¶‰‰‰¶¶ÁÁ¸¸ººÂ ç ç$$

図6.8: setjmp法と2返戻値法の比較

表6.4: 例外発生検査の実行回数 実行回数(103回)

ベンチマーク

非同期例外用

項目名 2返戻値法 setjmp ポーリング

201 compress 244,302 233,201 233,198

202 jess 77,900 44,433 36,513

209 db 141,947 82,195 79,127

213 javac 97,765 54,692 48,988

222 mpegaudio 157,782 137,752 137,751

227 mtrt 107,039 12,218 8,787

228 jack 158,741 145,138 139,307

実行回数の比較を示す.setjmp法では,非同期例外をポーリングする他に,静的コンパイ ル済みコード からインタプ リタを呼ぶ際などに例外処理方式を変換する過程で例外発生検 査を実行する.このため,setjmp法における例外発生検査の実行回数は非同期例外のポー リングに必要な回数より多くなる.なお,例外処理方式を変換する際の例外発生検査は非 同期例外のポーリングを兼ねる.

2返戻値法では関数呼出しからの返戻時にも例外発生検査を実行するが,setjmp法と比

較して例外発生検査の実行回数が大幅に増える項目は少ない.この原因は,非同期例外の ポーリング回数が多いために増加が目立たないことや,Java2Cトランスレータで インラ イン展開や下方移動を適用して例外発生検査を除去していることにある.

図6.8から,全てのベンチマーク項目で2返戻値法を採用した方が実行を高速化でき,

その差が最大で2.8%,相乗平均で1.5%に達することが判る.setjmp法の方が遅くなる

原因の1つとして,例外処理方式の変換のコストが考えられる.例外処理方式の変換は,

JeanPaulのインタプ リタがsetjmp法以外の方法で例外を処理するために必要になる処理

であり,インタプリタの実現によっては不要になりうる.そこで,図6.8にはsetjmp法と 2返戻値法による実行速度の他に,例外処理方式を変換する処理を強制的に全て省略して

setjmp法でベンチマークを実行した場合の実行速度も併せて示した.この場合の例外発生

検査の実行回数は表6.4の非同期例外用ポーリングの実行回数と同一である. 228 jack は実行時に例外処理方式の変換を必要とするため,変換処理を省略すると正常に動作しな いが ,他の項目については実行速度を測定できた.なお,2返戻値法では例外処理方式が インタプ リタと似ているため,例外処理方式の変換は不要である.

図6.8から,例外処理方式の変換にかかるコストを除いても,setjmp法による実行速度

が2返戻値法と同等以下であることが判る.

ˆ‡

ˆ‡‡‡

ˆ‡

ˆ‡‹‹

ˆ‡

ˆ‡





IIBB §§KK\\¢¢OOMM””ˆˆ‡‡|‡‡|€€

ˆ‡

ˆ‡‰‰

8+¼ ’¢OíÛ K ’¢OM

K ’¢OíÛ

ù»

ù»

”®|

”®|™™··jÄáá

¶¶‰‡ˆ‰‡ˆ¶¶ººÆÆÄÄÇɼÊÊÇɼÊÊ

¶¶‰‡‰‰‡‰¶¶ÁÁ¼ÊʼÊÊ

¶¶‰‡‰‡¶¶»¹»¹

¶¶‰ˆŠ‰ˆŠ¶¶ÁÁ¸¸Í͸º¸º

¶¶‰‰‰‰‰‰¶¶ÄǼ¾¸Ì»ÄǼ¾¸Ì»

ÀÀÆÆ

¶¶‰‰Ž‰‰Ž¶¶ÄËÄËÉÉËË

¶¶‰‰‰‰¶¶ÁÁ¸¸ººÂÂ

図6.9: 例外発生検査のオーバヘッド

6.3.4 2

返戻値法における例外処理のオーバヘッド

これまでの評価結果から,可搬的な例外処理の実現方式とし ては2返戻値法の方が優れ

ていることが判った.ここでは2返戻値法について,もう一歩踏み込み,2返戻値法による

例外処理の実現にどれだけオーバヘッドがかかるか評価する.評価は,2返戻値法のオーバ

ヘッド の発生原因である,関数呼出しの直後など に挿入する例外発生検査のコード を強制 的に全て排除した場合との実行速度の比較でおこなった.例外発生検査のコード を排除す ると,実行中に例外を投げるベンチマーク項目である 213 javac228 jackは正常に動 作しないので,これらの項目を評価対象から除外する.図6.9の評価結果から,例外発生検 査のコード の省略により1%以上実行が高速になるベンチマーク項目は, 201 compress

209 dbだけであることが判る.このことから,例外処理の実現方式として,2返戻値

法の代わりに,例外発生検査のコード を必要とせず,より効率がよい( 代わりに可搬性が

低くJava2Cトランスレータでは採用できない)といわれる表引き法を採用できたとし て

も,大きな実行速度の改善は望めないと推測する.

図6.9には,2返戻値法による例外処理において非同期例外検出用のポーリングがど の 程度のオーバヘッド をもたらすか評価した結果をあわせて示した.非同期例外をポーリン グするコード は,ループ 本体を実行する過程で必ず1回はポーリングするように必要とあ らば挿入するが,評価はこの非同期例外の検出のみを目的とする例外発生検査のコード を 強制的に排除した場合の実行速度との比較によりおこなった.

非同期例外検出用ポーリングのオーバヘッド は,ループ 本体が小さいマ イクロベンチ マーク( 図6.10)では大きく,36.8%に達した( 表6.5).しかし,SPECjvm98のように

実用的なサ イズのベンチマークでは最大でも3.2%にとど まり,それほど 大きくはならな い( 図6.9).このことから,ループの最適化が実行速度を大きく左右する科学技術計算系

int sum(int] array)f int result = 0

for(int i=0 i<array.length i++) result += arrayi]

return (result)

g

図6.10: マイクロベンチマーク

表6.5: マイクロベンチマーク実行結果

非同期例外向け例外発生検査の挿入 実行時間(ms

あり 14.855

なし 10.862

実行速度比 136.8%

※配列長は1,000とした.

のアプリケーションでなく,SPECjvm98のような整数系のアプ リケーションを主に実行 する場合には,非同期例外をポーリングで検出しても実行速度が大きく低下することはな いと考える.

ドキュメント内 言語への変換による (ページ 97-102)