こんにちは、うおなです。
業務で、システムの性能改善を求められる時があります。
そんな時に、便利なC#のStopwatchクラスをご紹介したいと思います。
今回は、C#のStopwatchクラスについて、よく使う部分だけ、要点を絞ってまとめたいと思います。
実際のコードを、まじえながら見ていきましょう
何をするクラスか
Stopwatchという名前の通り、時間計測をするためのクラスです。
現実に存在するストップウォッチと同じような感覚で使うことができます。
使うための準備
namespace(名前空間)の参照の追加
Stopwatchクラスは、System.Diagnostics 名前空間に用意されているクラスです。
時間計測をしたいコードが記述されているファイルに、次の文を書きます。
using System.Diagnostics;
名前空間関連の記述は、ファイルの上部にまとめて記述されていることが多いと思います。
その部分に合わせて書いてあげましょう。
基本的な使い方
Stopwatchクラスは、クラスなので、一度インスタンス化してから使う必要があります。
流れとしては、次の通りになります。
- 時間計測をしたいコードの前で、インスタンス化をする
- 時間計測をしたいコードの直前で、計測を開始するメソッドを実行する
- 時間計測をしたいコードが実行される
- 時間計測をしたいコード終了直後に、計測を終了するメソッドを実行する
- 計測結果を表示する
それでは、この5つの流れをコードに当てはめてみます。
適宜コメントで、補ってあります。
//名前空間
using System.Diagnostics;
// 1. インスタンス化し、stopwatchという変数に格納する
Stopwatch stopwatch = new Stopwatch();
// 2. 計測を開始するメソッドを実行する
stopwatch.Start();
// 3. 時間計測をしたいコード
Thread.Sleep(1000);
// 4. 計測を終了するメソッドを実行する
stopwatch.Stop();
// 5. 計測結果を表示する
Console.WriteLine(stopwatch.Elapsed.ToString());
使い方
ここから、Stopwatchクラスのよく使うメソッドやプロパティの使い方を、まとめていきます。
めそっどは、次のようにインスタンス化した後、
Stopwatch stopwatch = new Stopwatch();
作成したインスタンス変数から、使用します。
上の例であれば、「stopwatch」がインスタンス変数です。
仮に、「Start()」というメソッドを使う場合であれば、
stopwatch.Start();
という形になります。
プロパティの場合、
stopwatch.Elapsed;
のように、メソッドとは異なり、末尾に()は必要ありません。
それでは、以上を踏まえてみていきましょう
Start()
stopwatch.Start();
時間計測を、開始または再開するためのメソッドです。
時間計測を開始する時以外にも、一旦ストップウォッチの計測を止めて、再会する時にも使用します。
Stop()
stopwatch.Stop();
時間計測を止めるためのメソッドです。
再び、時間計測を再開したいときには、Startメソッドを呼び出します。
一旦計測時間を、0にリセットしてから、時間計測を再開したい場合は、Resetメソッドを呼び出してから、Startメソッドを呼び出します。
Reset()
stopwatch.Reset();
計測時間をリセットするためのメソッドです。
基本的には、Stopメソッドを呼び出した後に、Resetメソッドを呼び出し、再びStartメソッドを呼ぶという流れになると思いますが、
Stopメソッドを呼び出さずに、いきなりResetメソッドを呼び出しても、問題なく計測時間はリセットされ、0に戻ります。
Elapsed
Startメソッドを呼び出してから、Stopメソッドを呼び出すまでに経過した時間が格納されています。
この値は、Resetメソッドや、ReStartメソッドを呼ばない場合はリセットされません。
戻り値は、TimeSpan型です。
Console.WriteLine(stopwatch.Elapsed.ToString());
// 例 00:00:01.0143964
この例のように、Elapsed から、さらにToString() としてあげれば、文字列として使えるのでいろんなところに出力しやすくなると思います。
出力は、コメントに記載してあるように、0.0000000秒まで出力されます。
TimeSpan ts = stopwatch.Elapsed;
Console.WriteLine(ts.ToString());
もちろん、一度別の変数に格納して、他の関数に渡したりするのもアリです。
まとめ
今回は、C#の時間計測を行うためのクラスStopwatchクラスについて、よく使う部分をまとめてみました。
Stopwatchクラスには、他にもメソッドやプロパティがあるのですが、とりあえず時間計測をする場合には、今回紹介したもので、事足りているかなと思います。
あとは、For文と組み合わせてラップタイムを計るという使い方も考えられますね!
基本的な流れのおさらいです。
// 1. インスタンス化する
Stopwatch stopwatch = new Stopwatch();
// 2. 計測を開始する
stopwatch.Start();
// 3. 時間計測をしたいコード
Thread.Sleep(1000);
// 4. 計測を終了する
stopwatch.Stop();
// 5. 計測結果を表示する
Console.WriteLine(stopwatch.Elapsed.ToString());
これで、ばっちり時間計測ができます。
業務で性能改善なんかをするときには、このStopwatchクラスを使って、バシッとエビデンスを取っていきましょう!!