Mono 1.1.2のパフォーマンス

恒例のやつ。ただし、Mono上でStackAllocConstを実行すると強制終了してしまったのでテストから外しています。mcsでコンパイルしたアセンブリ(pmono.exe)を.NET1.1で実行してみます。

> pmono.exe

結果(on .NET1.1)

ArrayConst        :00:00:08.5156250
FixedConst        :00:00:13.0625000
AllocHGlobalConst :00:00:06.2500000
ArrayLocal        :00:00:06.7031250
ArrayLength       :00:00:07.2343750

とりあえず、これを基準に見ていきます。まずは、普通にMono上で実行です。

> mono pmono.exe

結果(on Mono)

ArrayConst        :00:00:11.2810000
FixedConst        :00:00:12.5150000
AllocHGlobalConst :00:00:08.3600000
ArrayLocal        :00:00:18.9840000
ArrayLength       :00:00:11.5630000

FixedConst以外は惨敗です。特にArrayLocalは3倍差がついていますね。しかし、Monoでは最適化オプションを指定できるので色々試してみます。まずは、一番効果が大きそうな配列境界チェックを外します。

> mono --optimize=abcrem pmono.exe

結果(on Mono +abcrem)

ArrayConst        :00:00:08.5320000
FixedConst        :00:00:08.3440000
AllocHGlobalConst :00:00:08.3440000
ArrayLocal        :00:00:14.7650000
ArrayLength       :00:00:08.3600000

かなり高速化されました。AllocHGlobalConstについてはunsafeなコードなので、元々チェックが入っていないので変化はありませんね。ただ、ArrayLocalが遅いのが気になります。ここで、さらに複写の伝播(copy propagation)を追加してみます。

> mono --optimize=abcrem,copyprop pmono.exe

結果(on Mono +abcrem,copyprop)

ArrayConst        :00:00:08.4850000
FixedConst        :00:00:08.3750000
AllocHGlobalConst :00:00:08.3750000
ArrayLocal        :00:00:08.3910000
ArrayLength       :00:00:08.3900000

やっと、ArrayLocalも速くなりました。.NET1.1と比較すると最大で1.3倍くらい遅いですが、結構良いところまで来ている気がします。

今回は、コンパイラをmcsに固定してMonoと.NET1.1というランタイム環境の違いを見てみました。もちろん、コンパイラの違いによるパフォーマンスの差も結構あるのですが、その調査はまた次回ということに。