BenchmarkDotNetを.NET Frameworkと.NET Coreで走らせる方法

このエントリーをはてなブックマークに追加

C#でベンチマークを取る際に非常に楽に実施できるツールのBenchmarkDotNetで.NET Frameworkと.NET Core両方でベンチマークを取る方法がわかったのでメモ取っておきます。

内容はBenchmarkDotNetのFAQに書いてあります。
(ちゃんとFAQ読め案件)

ベンチマーク対象に.NET Frameworkと.NET CoreのJobを付けるだけでは、ベンチマーク実施時にどちらかのJobで失敗してしまいます。

[ClrJob, CoreJob]
public class Bench{ }

指定方法は上のような感じです。

原因は簡単でTargetFrameworkが普通にプロジェクトを作成したらどちらか片方だけになってしまうからです。

そのため、csprojを弄って両方のTargetFramework指定をする必要があります。 自分の場合は元のprojectが.NET Framework向けでcsprojがややこしかったので、.NET Core projectを作成しなおしました。

csprojを開くと

    <TargetFramework>netcoreapp2.0</TargetFramework>

のような箇所があるので以下のように書き換えましょう

    <TargetFrameworks>netcoreapp2.1;net47</TargetFrameworks>
    <PlatformTarget>AnyCPU</PlatformTarget>

最新の.NET Core 2.1でパフォーマンスが向上しているのでベンチマークを取る際は通常は2.1指定でいいと思います。 .NET Frameworkはバージョン間の違いがわからなくなってきてる節がありますが、とりあえず新しいものでベンチマークを取りましょう。

csprojを編集したら、ベンチマーク対象にJobを付けてやることで.NET Frameworkと.NET Coreでベンチマークが取れるはずです。 (そもそも.NET Frameworkな時点で実行OSはWindowsであることが求められますけどね)