[C#] 処理時間を計測する方法 [Stopwatch]

C#

この記事では、C#で処理時間を計測する方法を解説します。

正確な処理時間を計測できれば、ボトルネック(時間のかかっている処理)の特定と速度の向上につながります。
これはアプリケーションの最適化には欠かせないテクニックです。ぜひ覚えておきましょう。

当記事では、処理速度の計測方法を具体的なサンプルコードと共に解説していますので、参考にしてみてください!

ひつじさん
ひつじさん

処理時間が知りたい人は集合してください。

 

概要

Stopwatchクラス

処理時間の計測には、Stopwatchクラスを使用します。

Stopwatchクラスは高精度な時間計測を行うためのクラスです。計測の開始、停止、リセット、再開などの処理を簡単に実装できるようになっています。

以下に主要なメソッドとプロパティをまとめました。

主要なメソッド

メソッド名説明
Start()計測を開始
Stop()計測を停止
Reset()計測時間をリセット
Restart()計測時間のリセット&再スタート

主要なプロパティ

プロパティ名説明
Elapsed計測時間をTimeSpan型で取得
ElapsedMilliseconds計測時間をミリ秒で取得
ElapsedTicks計測時間をタイマーの刻み回数で取得
IsRunningStopwatchの動作状況を取得
動作中=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から算出すればマイクロ秒単位の時間も取得できる。

処理時間の計測を活用すれば、パフォーマンスが最適化された高品質なコードを書けるようになります!ぜひ覚えておきましょう!あるいは、このページをブックマークしていつでも読み返せるようにしておきましょう!

コメント

タイトルとURLをコピーしました