第 3 章 仮想メソッド呼び出しの高速化
3.5 実験結果
3.5.2 性能評価
57 表 3.3: 実行回数の減少率に基づく各デバーチャル化手法の効果
ベンチマーク NからMCTPでの削減率 MからMCTPでの 削減率
MCからMCTPでの 削減率
MCTからMCTPでの 削減率 仮想メソ
ッド呼び 出し
インタフェー スメソッド呼
び出し
両方 メソッドテストに よってテスト無しで
実行できるコード
コード書き換えに よってテスト無しで
実行できるコード
コード書き換えによって テスト無しで実行できる
コード compress 43.5% 0.6% 41.9% 100.0% 18.6% 22.2%
jess 82.0% 0.7% 80.4% 100.0% 6.5% 26.0%
db 97.1% 99.9% 97.7% 100.0% 0% 0%
javac 47.1% 8.8% 44.6% 91.0% 7.0% 22.1%
mpegaudio 32.8% 99.8% 34.0% 100.0% 0% 88.9%
mtrt 98.6% 0.7% 98.6% 100.0% 6.6% 31.2%
jack 74.0% 39.8% 69.1% 100.0% 3.0% 22.8%
pseudojbb 94.4% 0.9% 92.3% 100.0% 2.3% 22.0%
caribbean 69.4% 11.7% 68.1% 100.0% 1.0% 36.3%
平均 71.2% 31.4% 69.8% 98.9% 5.5% 29.3%
N: デバーチャル化適用無し。
M: メソッドテストを適用。
MC: メソッドテスト、コード書き換えを適用。
MCT: メソッドテスト、コード書き換え、局所クラス解析を適用。
MCTP: メソッドテスト、コード書き換え、局所クラス解析、preexistence解析を適用。
表 3.4に、メソッドテスト、コード書き換え、局所クラス解析、preexistence 解析と4つのデ バーチャル化手法を全て適用した場合に、コード書き換えによって直接デバーチャル化された コードがどの程度の割合で実行されるか、書き換えられた仮想メソッド呼び出しサイトの数、
preexistence 解析によって再コンパイルされたメソッド数、を示す。直接デバーチャル化された
コードが実行される割合は、96.6%〜100%(平均 99.5%)と非常に高い。つまり、最初のメソッ ド呼び出し時にオーバライドされていない仮想メソッド呼び出しは、後からオーバライドされ ることが非常に少ない。また、コード書き換えが起きる呼び出しサイト数や再コンパイルされ るメソッドの数も、非常に少ない。この傾向はプログラムの特性に大きく依存し、今回の実験 の対象が主にベンチマークプログラムであることも一因であると考えられる。
表 3.4: 直接デバーチャル化された仮想メソッド呼び出しサイトの特性
ベンチマーク テスト無しに実行可能な コードの実行割合
コード書き換えが起きた 仮想メソッド呼び出しサイト数
再コンパイルされた メソッド数
compress 96.6% 25 4
jess 100% 28 4
db 100% 25 4
javac 99.9% 28 8
mpegaudio 99.9% 25 4
mtrt 100% 25 4
jack 99.5% 29 4
pseudojbb 100% 13 2
caribbean 100% 77 4
平均 99.5% 24.8 4.3
58 第3章 仮想メソッド呼び出しの高速化 下のデバーチャル化を適用したときの値である。
M メソッドテスト
MC メソッドテスト、コード書き換え
MCT メソッドテスト、コード書き換え、局所クラス解析
MCTP メソッドテスト、コード書き換え、局所クラス解析、preexistence解析
0.9 1 1.1 1.2 1.3 1.4
compress jess db javac mpegaudio mtrt jack pseudojbb caribbean
プログラム
デバーチャル化無しに対する性能向上 M
MC
MCT
MCTP 2.7
2.8
図 3.16: SPECjvm98とSPECjbb2000の性能向上割合(PowerPC)
0.9 1 1.1 1.2 1.3 1.4 1.5 1.6
compress jess db javac mpegaudio mtrt jack pseudojbb caribbean
プログラム
デバーチャル化無しに対する性能向上 M
MC
MCT
MCTP 2.1
2.2
図 3.17: SPECjvm98とSPECjbb2000の性能向上割合(IA-32)
59
0.9 1 1.1 1.2 1.3 1.4 1.5
compress jess db javac mpegaudio mtrt jack pseudojbb caribbean
プログラム
デバーチャル化無しに対する性能向上 M
MC
MCT
MCTP 2.1
2.2
2.0
図 3.18: SPECjvm98とSPECjbb2000の性能向上割合(IA-64)
間接デバーチャル化によるメソッドテストだけを適用した場合には、ほとんど性能に変化が ない。PowerPC のcaribbean では、性能が悪化している。一方、IA-32 のcaribbean では、性能が 向上している。
コード書き換えによる直接デバーチャル化も適用した場合には、相乗平均で PowerPC では
16.9%、IA-32 では10.8%、IA-64では12.7%の性能向上が得られた。特にmtrtでの性能改善が大
きい。3.5.1節でも述べたが、このプログラムでは、インスタンス変数の参照を行う小さなメソ ッドの呼び出し頻度が非常に多い。このメソッド呼び出しが直接デバーチャル化によってイン ライン展開されて、オーバヘッド無しで実行可能になったため、性能が大きく向上した。
さ ら に 、 局 所 ク ラ ス 解 析 に よ る 直 接 デ バ ー チ ャ ル 化 も 適 用 し た 場 合 に は 、 相 乗 平 均 で
PowerPC では20.2%、IA-32 では 13.6%、IA-64 では 13.6%の性能向上が得られた。特に、db で
の性能改善が大きい。この理由は、3.5.1節で述べたが、局所クラス解析の結果を用いたクラス 階層解析によってインタフェースメソッド呼び出しを仮想メソッド呼び出しに変換でき、さら にその仮想メソッド呼び出しを直接デバーチャル化してインライン展開されたコードを実行で きたためである。さらに、PowerPCとIA-32 でのjavac の性能向上も大きい。このプログラムで は、hashCode()、equals()、toString()メソッドを用いてStringオブジェクトを操作する ことが多く、これらのメソッド呼び出しが局所クラス解析の結果を用いてコード書き換えによ る直接デバーチャル化が可能になり、インライン展開されたコードをテスト無しで実行できた ためである。
最後に、preexistence 解析による直接デバーチャル化も適用し、3.4.4節で述べたデバーチャル 化の戦略を全て実行した場合には、相乗平均で PowerPC では 18.3%、IA-32 では 17.9%、IA-64
では14.7%の性能向上が得られた。IA-64 のmtrtで、さらに性能が改善した理由は以下の通りで
あ る 。preexistence 解 析 を 用 い た デ バ ー チ ャ ル 化 に よ っ て 、 頻 繁 に 呼 び 出 し さ れ る spec.benchmarks._205_raytrace.OctNode クラスの Intersect()メソッド内にある仮 想メソッド呼び出しが、脱出解析においてオブジェクトの脱出点となる仮想メソッド呼び出し
60 第3章 仮想メソッド呼び出しの高速化
を生成することなく直接デバーチャル化された。その結果、捕捉されたオブジェクトの各フィ ールドに対してスカラへの置き換えを適用できたためである。
一方、PowerPCのjessとcaribbeanで性能が落ちている理由は不明である。