Ubuntu18.04 on WSLでMonoのベンチマークを取ろうと試行錯誤した際のメモです。
環境
Monoのインストール
公式サイトに従って設定します。
sudo apt install gnupg ca-certificates
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo"deb https://download.mono-project.com/repo/ubuntu stable-bionic main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
sudo apt update
そして、mono-completeをインストールします。
sudo apt install mono-complete
単にmono
コマンドを実行してエラーがなくても、アセンブリが不足する可能性があるので、mono-complete
にします。
アセンブリが不足していると、例えば下記のようなエラーになります。
CS1069: The type name 'Console' could not be found in the namespace 'System'. This type has been forwarded to assembly 'System.Console, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' Consider adding a reference to that assembly.
.NET Coreのインストール
今回は.NET Coreの結果を比較するために、.NET Core SDKをインストールしておきます。
もう覚えていませんが、公式サイト通りにやればできたはず。
ベンチマークコード
.csprojファイル
ターゲットフレームワークは<TargetFrameworks>
のみで、<TargetFramework>
は含めません。
Monoはnet48をサポートしていないという情報を見かけたので、net472にしました。
<TargetFrameworks>netcoreapp3.1;net472</TargetFrameworks>
Config
Configクラスに、Monoと比較用の.NET Core 3.1を追加します。
AddJob(Job.ShortRun.WithWarmupCount(1).WithIterationCount(1).WithRuntime(MonoRuntime.Default));AddJob(Job.ShortRun.WithWarmupCount(1).WithIterationCount(1).WithRuntime(CoreRuntime.Core31));
各ベンチマークコード
クラスに[DisassemblyDiagnoser]
を付与しているのであれば、Monoはサポートしていないので外します。
こんなエラーになります。
DisassemblyDiagnoser supports only .NET Core 3.0+
ビルド
Windows側で行います。
これは単に私がMono環境下でのビルドの知見が無いためです。
実行
場所
面倒なので、Windowsでビルドした一式をWSL側にコピーします。(\\wsl$
を使うのが良いでしょう)
プロジェクトファイルを/tmpに置いてはいけません。
こんなエラーになります。
Assembly BenchmarkVsReleasedVersion, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null is located in temp. If you are running benchmarks from xUnit you need to disable shadow copy. It's not supported by design.
Monoで実行
Windowsでの実行と同様に、一番クラシックな環境で実行するので、mono
コマンドで実行します。
mono bin/Release/net472/Benchmark.exe
sudo
で実行する必要があります。
普通に実行するとこんなエラーになります。
Failed to set up high priority. Make sure you have the right permissions. Message: Invalid data
以上でベンチマークが取れるようになりました。