もっと詳しく

プログラミングをしていると、たまに処理時間を計測したくなるときがありますよね。

今回は、C#を使って処理時間を計測するための Stopwatch クラスについて、その使い方について解説したいと思います。

各メソッドの違いや計測結果の取得方法ついて、いまいち理解しきれていない方は、是非この記事をご一読ください。

Stopwatchクラスの概要

Stopwatch クラスは、高分解能なパフォーマンスカウンタがあればそれを利用し、なければシステムのタイマーを利用することで、走らせるパソコンで最も高精度な時間計測を行ってくれます。

使い方は簡単で、インスタンスを生成した後、Start メソッドで計測を開始し、Stop メソッドで計測を停止します。

計測結果は、経過秒をミリ秒単位で受け取りたい場合は ElapsedMilliseconds プロパティを、TimeSpan型で受け取りたい場合は Elapsed プロパティを参照するだけです。

使い方

まず初めに、プログラムの冒頭に次の1行を記述します。

using MathNet.Numerics.Statistics;

準備がこれだけです。

以下は簡単なサンプルになります。

//インスタンスの生成
var sw = new Stopwatch();

//計測の開始
sw.Start();

//計測したい処理 ------------------
for(int i = 0; i < 100000;i ++)
   new List<string>();
//---------------------------------

//計測の停止
sw.Stop();

//計測結果の出力
Console.WriteLine("計測時間1:{0}", (double)sw.ElapsedMilliseconds / 1000);
Console.WriteLine("計測時間2:{0}", sw.ElapsedMilliseconds);
Console.WriteLine("計測時間3:{0}", sw.Elapsed);

結果は以下の溶離になります。

ElapsedMilliseconds はミリ秒なので、秒単位に変換した方が見やすい場合が多いです。

なので、計測時間1は1000で割って秒に換算しています。

計測時間が数十分や数時間に渡る場合は、Elapsed の方が分かりやすいかと思います。

ミリ秒よりもっと高い精度が欲しい場合は、Elapsed を使います。

この他にも、Restart と Reset というメソッドが用意されていますので、メソッドとプロパティを一覧にまとめておきます。

メソッド/プロパティ 名前 内容
メソッド Start 計測を開始する
メソッド Stop 計測を終了する
メソッド Reset 現在の経過時間をリセットする
メソッド Restart 現在の経過時間をリセットし、再び計測を開始する
プロパティ ElapsedMilliseconds 経過時間をミリ秒単位の整数で返す
プロパティ Elapsed 経過時間をTimeSpan型で返す

Start メソッドとStop の挙動

Start メソッドで計測を開始し、Stop メソッドで計測を停止しますが、Stopwatchクラスの内部では累計時間が保持されており、再びStartメソッドを呼び出すと、その累計時間からスタートします。

実際に処理時間を計測する場合、それまでの途中経過として計測結果を表示しながら、最終的に全体の処理時間を知りたい場合はこの方法が適しています。

しかし、処理時間を10回計測して平均を出したい場合は、1回計測するごとにResetメソッドでリセットする必要が生じるため、ResetとStartをまとめて行ってくれるRestartメソッドが用意されています。

StartNew について

他のサイトではあまり紹介されていませんが、StartNewメソッドを使うことで、Restartと同じことが出来ます。

StartNew メソッドは静的なStopwatchクラスに備わっているため、new Stopwatch() でインスタンスを生成しても使えませんのでご注意ください。

// new によりStopwatch のインスタンスを生成する方法
var sw = new Stopwatch();

// 静的な Stopwatchクラスの StartNew メソッドでインスタンスを生成する方法
var sw = Stopwatch.StartNew();

Stopwatch.StartNew メソッドでインスタンスを生成すると、その時点で計測が開始されます。

下図は、new Stopwatch() と Stopwatch.StartNew() の挙動を図式化したものです。

以下は Stopwatch.StartNew のサンプルになります。

//インスタンスの生成と同時に計測の開始
var sw = Stopwatch.StartNew();

//計測したい処理 ------------------
for(int i = 0; i < 100000;i ++)
   new List<string>();
//---------------------------------

//計測の停止
sw.Stop();

//計測結果の出力
Console.WriteLine("計測時間:{0}", sw.Elapsed);

まとめ

今回は C#でStopwatchクラスを使った処理時間の計測方法について紹介しました。

Stopwatch のインスタンスを生成した後、Lapタイムのように途中経過を知りたい場合は、Start~Stop、同じ処理を複数回計測して平均を出したい場合は Restart~Stop を使います。

また、静的Stopwatch なStopwatchクラスに備わっている StartNew メソッドでStopwatch インスタンスを生成すると、その時点で自動的に計測が開始されるので、Restart~Stop の代わりにこちらを使うことも出来ます。

非常に簡単に使えて高精度な計測が可能ですので、処理時間を計測したくなったら、是非この記事を参考にしてください。