時間的パフォーマンスを気軽に計測する方法 [備忘録]
1. はじめに
巷で噂されている、”エンジニアは疲れているほうがプログラミングに集中できる”というのは事実かもしれないと信じつつある、エンジニアの糸賀です
ところで、皆さんはこういった経験はございますか。
- がんばって実装したのにその処理を実行してみると許容できないくらいの時間がかかった。
- 複雑な処理を書いたのでパフォーマンス要件を満たしているかどうか確認したい。
- 実装した処理単位で気軽にパフォーマンスを計測できたらいいのに。
上記のようなケースで使えるモジュールが存在します。マイクロソフトの公式ドキュメントにわかりやすい例文とともにそれについて紹介されているので、もしかするとすでに知っている方も多いかもしれません。この記事では備忘録を目的にそれをかみ砕いて紹介します。
検証環境
C# バージョン: C# 7.3
Target Framework: .NET Framework 4.5
2. Stopwatch Class
これを使えば、処理の範囲を指定し、その処理の実行にどの程度時間がかかったのかを計測できます。例を見ていただいたほうがより早く理解していただけると思います。
例1
class Program
{
static void Main(string[] args)
{
var watch = Stopwatch.StartNew();
Process();
watch.Stop();
Console.WriteLine($"Time Taken: { watch.ElapsedMilliseconds } ms.");
Console.ReadLine();
}
private static void Process()
{
for (var i = 0; i < 100000; i++)
{
var result = i * 2;
Console.WriteLine($"{ i } * 2 = { result }");
}
}
}
StartNew()関数が実行されてから、StartNew()の戻り値であるStopwatchオブジェクトのStop()関数を実行するまでの時間を計測できます。Stopwatchオブジェクト内に結果が格納されています。したがって、それを参照すれば計測結果を出力可能です。
また、以下のように複数処理の時間的パフォーマンスの比較もできます。
例2
class Program
{
static void Main(string[] args)
{
var watchForProcessA = Stopwatch.StartNew();
ProcessA();
watchForProcessA .Stop();
var watchForProcessB = Stopwatch.StartNew();
ProcessB();
watchForProcessB .Stop();
Console.WriteLine($"ProcessA Time Taken: { watchForProcessA.ElapsedMilliseconds } ms.");
Console.WriteLine($"ProcessB Time Taken: { watchForProcessB.ElapsedMilliseconds } ms.");
Console.ReadLine();
}
private static void ProcessA()
{
for (var i = 0; i < 100000; i++)
{
var result = i * 2;
Console.WriteLine($"{ i } * 2 = { result }");
}
}
private static void ProcessB()
{
foreach(var i in Enumerable.Range(0, 100000))
{
var result = i * 2;
Console.WriteLine($"{ i } * 2 = { result }");
}
}
}
いかがでしたでしょうか。アセンブリを呼び出すだけで気軽に時間的パフォーマンスを計測できるので、私はこれを重宝します。
3. Reference
Stopwatch Class – Microsoft Documentation
https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.stopwatch?view=net-5.0