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が遅すぎるのかも。