Monoとside-by-side

昨日のmcsとcscのパフォーマンスの違いがやっと判明。同じバージョンのCLR上で動いてると思ったら、実はmcsでコンパイルした方は1.0.3705、cscは1.1.4322で動いていたというオチでした。.NET Frameworkを2バージョン入れているのでside-by-side実行されるってことをすっかり忘れていました。(^^;

mcsでコンパイルしたモジュールは、こんな風に設定ファイルで1.1.4322を優先するようにしたほうが良さそうですね。

<?xml version="1.0" ?>
<configuration>
<startup>
   <supportedRuntime version="v1.1.4322" />
   <supportedRuntime version="v1.0.3705" />         
</startup>
</configuration>

あと、各コンパイラでの違い。

// mcs
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 1:0:3300:0
}
// csc
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 1:0:5000:0
}
// cscc
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 1:2:3400:0
}

DotGNUはやる気のないバージョンですね。(^^;

しかし、.NET1.0と.NET1.1を比較すると、モノにもよると思いますが今回の例だと100倍近く.NET1.1が速かったです。これなら、ループ毎にGC.Collect(0)やっても、良いんじゃないかな?と、誘惑に駆られます(笑)。ま、1.0が遅すぎるのかも。