この記事では、C#で処理時間を計測する方法を解説します。
正確な処理時間を計測できれば、ボトルネック(時間のかかっている処理)の特定と速度の向上につながります。
これはアプリケーションの最適化には欠かせないテクニックです。ぜひ覚えておきましょう。
当記事では、処理速度の計測方法を具体的なサンプルコードと共に解説していますので、参考にしてみてください!

処理時間が知りたい人は集合してください。
概要
Stopwatchクラス
処理時間の計測には、Stopwatchクラスを使用します。
Stopwatchクラスは高精度な時間計測を行うためのクラスです。計測の開始、停止、リセット、再開などの処理を簡単に実装できるようになっています。
以下に主要なメソッドとプロパティをまとめました。
主要なメソッド
メソッド名 | 説明 |
---|---|
Start() | 計測を開始 |
Stop() | 計測を停止 |
Reset() | 計測時間をリセット |
Restart() | 計測時間のリセット&再スタート |
主要なプロパティ
プロパティ名 | 説明 |
---|---|
Elapsed | 計測時間をTimeSpan型で取得 |
ElapsedMilliseconds | 計測時間をミリ秒で取得 |
ElapsedTicks | 計測時間をタイマーの刻み回数で取得 |
IsRunning | Stopwatchの動作状況を取得 動作中=true/停止中=false |
サンプル&詳細解説
Start、Stopメソッドの使用方法
処理時間計測の基本として、まずStart/Stopメソッドを確認してみましょう。
サンプルコード
using System;
using System.Diagnostics;
namespace SampleCode
{
class SampleCode
{
static void Main()
{
Stopwatch sw= new Stopwatch();
sw.Start(); // 計測開始
// 計測対象の処理
PerformTask(5000000);
sw.Stop(); // 計測終了
// 処理時間(ミリ秒)をコンソールに出力
Console.WriteLine($"処理時間: {sw.ElapsedMilliseconds} ms");
Console.ReadKey();
}
// サンプル用ループ処理
static void PerformTask(long num)
{
long sum = 0;
for (int i = 0; i < num; i++)
{
sum += i;
}
}
}
}
実行結果 ※時間は実行環境によって異なります
処理時間: 1 ms
上記サンプルのように、計測したい処理の前後にStartメソッドとStopメソッドを入れてください。
出力部分に関しては、ElapsedMillisecondsプロパティで計測時間をミリ秒単位で取得しています。
Restart、Resetメソッドの使用方法
次にRestart、Resetメソッドも使ったサンプルです。
計3回の測定を行っており、処理時間は順番に長くしています。
サンプルコード
using System;
using System.Diagnostics;
namespace SampleCode
{
class SampleCode
{
static void Main()
{
Stopwatch sw = new Stopwatch();
sw.Start(); // 計測開始
// 計測対象の処理(1回目)
PerformTask(5000000);
sw.Stop(); // 計測停止
// 処理時間(ミリ秒)をコンソールに出力
Console.WriteLine($"処理時間1: {sw.ElapsedMilliseconds} ms");
sw.Reset(); // 計測時間をリセット
sw.Start(); // 計測開始
// 計測対象の処理(2回目)
PerformTask(10000000);
sw.Stop(); // 計測停止
// 処理時間(ミリ秒)をコンソールに出力
Console.WriteLine($"処理時間2: {sw.ElapsedMilliseconds} ms");
sw.Restart(); // 計測再スタート
// 計測対象の処理(3回目)
PerformTask(15000000);
sw.Stop(); // 計測停止
// 処理時間(ミリ秒)をコンソールに出力
Console.WriteLine($"処理時間3: {sw.ElapsedMilliseconds} ms");
Console.ReadKey();
}
static void PerformTask(long num)
{
// サンプル用ループ処理
long sum = 0;
for (int i = 0; i < num; i++)
{
sum += i;
}
}
}
}
実行結果 ※時間は実行環境によって異なります
処理時間1: 1 ms
処理時間2: 2 ms
処理時間3: 4 ms
このように、RestartとResetは、複数回計測したい場合に使うと便利です。
複数回計測する際は、ResetやRestartで計測時間をリセットしないと前回の計測値が残ってしまうのでご注意ください。
マイクロ秒単位での処理時間取得
最後に、マイクロ秒単位で処理時間を取得する方法を解説します。
マイクロ秒単位の時間を直接取得できるプロパティは用意されていませんので、ElapsedTicksプロパティとFrequencyフィールドから算出します。
ElapsedTicks:タイマー刻み回数であらわした計測時間
Frequency:1秒当たりのタイマー刻み回数
ですので、計算式は以下のようになります。
計測時間(マイクロ秒) = ElapsedTicks ÷ Frequency × 1000000
実際のコードで確認してみましょう。
サンプルコード
using System;
using System.Diagnostics;
namespace SampleCode
{
class SampleCode
{
static void Main()
{
Stopwatch sw= new Stopwatch();
sw.Start(); // 計測開始
// 計測対象の処理
PerformTask(5000000);
sw.Stop(); // 計測終了
// マイクロ秒 (μs) に変換
long elapsedMicroseconds = sw.ElapsedTicks * 1000000 / Stopwatch.Frequency;
// 処理時間(マイクロ秒)をコンソールに出力
Console.WriteLine($"処理時間: {elapsedMicroseconds} μs");
Console.ReadKey();
}
// サンプル用ループ処理
static void PerformTask(long num)
{
long sum = 0;
for (int i = 0; i < num; i++)
{
sum += i;
}
}
}
}
実行結果 ※時間は実行環境によって異なります
処理時間: 1314 μs
まとめ
以下は当記事のまとめです!
- 処理時間の計測にはStopwatchクラスを使用する。
- ElapsedMillisecondsでミリ秒単位の時間を取得できる。
- ElapsedTicksとFrequencyから算出すればマイクロ秒単位の時間も取得できる。
処理時間の計測を活用すれば、パフォーマンスが最適化された高品質なコードを書けるようになります!ぜひ覚えておきましょう!あるいは、このページをブックマークしていつでも読み返せるようにしておきましょう!
コメント