第 6 章 例外処理の実現
6.3 評価
6.3.1 setjmp 法向け最適化の評価
setjmp法向け最適化が実行速度に与える影響を評価した結果を図6.6に示す.評価は全
ての最適化を適用した場合の実行速度を基準として,個々の最適化を適用しなかった場合
IIBB Ðи¸KK¨¨¡¡{{MM||
u1¨Ê{-
K¨¡{-
®|
®|··jjÄÄáá
¶¶¶¶ººÆÆÄÄÇÇɼɼÊÊÊÊ
¶¶¶¶ÁÁ¼Ê¼ÊÊÊ
¶¶¶¶»¹»¹
¶¶¶¶ÁÁ¸¸Í¸Í¸ºº
¶¶¶¶ÄǼÄǼ¾¾¸Ì»¸Ì»ÀÀÆÆ
¶¶¶¶ÄËÉËÄËÉË
¶¶¶¶ÁÁ¸¸ººÂ ç ç$$ l3- 1°ð-l3-
£Ç|1µ1°ð-8öª
図 6.6: setjmp法向け最適化が実行速度に与える影響
にどれだけ実行速度が低下するか測定することでおこなった.低下率が大きいほど 有効な 最適化であるといえる.図6.6の縦軸は最適化を適用しなかった場合の実行速度の低下率 を表し,横軸はベンチマーク項目名を表す.個々の最適化の効果について考察する.
volatile宣言の最小化
図6.6から,volatile宣言の最小化が実行速度に相乗平均で1.2%,項目別では 209 db
と 213 javac,228 jackにそれぞれ4.1%,2.5%,2.4%の影響を与えることが判る.こ の値は単一の最適化から得られる値として決して小さくなく,したがってvolatile宣言の 最小化は実現する価値のある最適化であるといえる.なお,volatile宣言の最小化によっ てvolatile宣言する自動変数の数に与える影響を評価した結果を表6.2に示す.表6.2,
図6.6において,最適化なしとはtryブロックをもつメソッド 内の全自動変数をvolatile 宣言する場合を表す.表6.2から,最適化によってvolatile宣言する自動変数の数が最 適化なし の場合と比較して 1
10
以下に減少することが判る.
表6.2: volatile宣言の最小化によるvolatile宣言数の変化
try volatile宣言数 ベンチマーク 自動変数
ブロック 最適化 項目名 宣言総数
総数 なし あり 201 compress 5,532 97 1,012 70
202 jess 10,100 121 1,276 86
209 db 6,095 106 1,193 84
213 javac 13,873 180 2,094 150
222 mpegaudio 9,088 97 1,155 86
227 mtrt 6,524 105 1,235 74
228 jack 9,347 168 1,817 96
表6.3: enterTry()の実行回数と最適化の影響
enterTry() ベンチマーク 実行
実行箇所 平均 throw
項目名 時間
tryブロック入口 例外処理方式変換部 実行 回数
(sec) 最適化なし 最適化あり( 削減率) 最適化なし 最適化あり( 削減率) 頻度
201 compress 253.8 1,959 1,882( 3.93%) 1,644 882(46.35%) 11 0
202 jess 401.2 1,240,894 30,599(97.53%) 707,879 705,674( 0.31%) 1,835 0
209 db 737.0 61,438,533 32,154(99.95%) 28,5355 283,097( 0.79%) 428 0
213 javac 315.7 1,609,073 952,535(40.80%) 2,628,947 2,192,371(16.61%) 9,960 21,373
222 mpegaudio 280.6 2,146 2,136( 0.47%) 18,532 17,794( 3.98%) 71 0
227 mtrt 403.0 4,909 4,772( 2.79%) 349,625 189,835(45.70%) 483 0
228 jack 312.6 7,385,349 4,371,780(40.80%) 634,660 499,353(21.32%) 15,581 241,876
※削減率は,最適化によって減少したenterTry()の実行回数の比率を表す.
※実行時間は,例外処理をsetjmp法で実施(全setjmp法向け最適化を適用)した場合のベンチマークの実行時間を表す.
※平均実行頻度は最適化時のenterTry() マクロの秒間あたりの実行回数で、総実行回数を実行時間で除して求めた値である.
冗長なenterTry()
,
exitTry()の除去図6.6から,冗長なenterTry(),exitTry()の除去が 209 dbに特に有効な最適化であり,
最適化を適用しないと実行速度が8.4%遅くなってしまうことが判る.最適化がenterTry() の実行回数に与える影響を評価した結果を表6.3に示す.表6.3から, 209 dbについて,
最適化によってenterTry()の実行回数を99.95%削減していることが 判り,実行速度の 改善が偶然によるものではないと判断できる.
冗長な例外処理方式の変換の除去
図6.6から,冗長な例外処理方式の変換を除去する最適化に実行速度を改善する効果は余 りないといえる.最適化が例外処理方式の変換をどれだけ除去するか評価した結果を表6.3
に示す.表6.3から,最適化によって例外処理方式の変換回数,すなわち例外処理方式変 換部におけるenterTry()の実行回数が0.31%〜46.35%減少することが 判る.46.35%と
いう数字は小さくないが,それにもかかわらず実行速度に影響がでないのは,そもそもイ
ンタプ リタから静的コンパイル済みコード を呼び出す回数( 表6.3の,例外処理変換部で
最適化なし の場合にenterTry()を実行する回数)自体が少ないためだと考える.
setjmp()の利用
図6.6から, setjmp(),longjmp()の代わりにsetjmp(),longjmp()を使うと相乗
平均で0.70%実行速度が低下することが判る.特に 213 javacと 228 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%低下することが 判り,下方移動による最適化があ る程度有用であるといえる.