Windows Formsで開発したソフトウェアのパフォーマンスを改善しようと思い、BenchmarkDotNetを使用してみました。
はじめに
公式サイトではコンソールアプリケーションでしか使用できないみたいなことが書かれていましたが、Windows Formsでも通常のコンソールアプリケーションと同様の使用方法で使用することができました。
手順
BenchmarkDotNetを使用する手順は以下になります。
- NuGetでBenchmarkDotNetをインストール
- 計測対象のメソッドを含むクラスを作成
- メイン関数からメソッドを呼び出して計測開始
NuGetでBenchmarkDotNetをインストール
Visual Studioを起動して[ツール]⇒[NuGet パッケージマネージャー]からBenchmarkDotNetを検索してインストールします。
計測対象のメソッドを含むクラスを作成
以下のコードのように計測対象のメソッド含むクラスを作成して、対象メソッドに[Benchmark]属性を指定するだけです。計測するためにクラスを作成するのはめんどくさいですが仕方ありません。
今回はフォームにボタンを配置し、そのボタンのクリックイベントでベンチマークを実行します。ベンチマークの実行は時間がかかる場合があるため、UIの応答性を保つために非同期で実行します。ボタンをクリックすると、ベンチマークが非同期で実行され、完了するとメッセージボックスが表示されます。
public partial class Form1 : Form
{ public Form1() { InitializeComponent(); } private async void button1_Click(object sender, EventArgs e) { await Task.Run(() => BenchmarkRunner.Run<SimpleBenchmark>()); MessageBox.Show("Benchmark completed!"); }
}
public class SimpleBenchmark
{ [Benchmark] public void TestMethod() { for (int i = 0; i < 1000; i++) { var x = Math.Sqrt(i); } }
}
メイン関数からメソッドを呼び出して計測開始
プロジェクトをビルドして実行します。ボタンをクリックすると、ベンチマークが非同期で実行され、完了するとメッセージボックスが表示されます。
実行するとReleaseフォルダ内にログファイルが生成され、ベンチマークの結果を確認できます。
おわりに
Stopwatch クラスで計測してもいいのですが、正確に計測するためにはBenchmarkDotNetが必要みたいですね。公式ドキュメントではコンソールアプリケーションでしか使用できないみたいなことが書かれていましたが、Windows Formsでも問題なく使用することができました。