英語で読む

次の方法で共有


Stopwatch クラス

定義

経過時間を正確に計測するために使用できる一連のメソッドとプロパティを提供します。

public class Stopwatch
継承
Stopwatch

次の例では、 クラスを Stopwatch 使用してアプリケーションの実行時間を決定する方法を示します。

using System;
using System.Diagnostics;
using System.Threading;
class Program
{
    static void Main(string[] args)
    {
        Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();
        Thread.Sleep(10000);
        stopWatch.Stop();
        // Get the elapsed time as a TimeSpan value.
        TimeSpan ts = stopWatch.Elapsed;

        // Format and display the TimeSpan value.
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes, ts.Seconds,
            ts.Milliseconds / 10);
        Console.WriteLine("RunTime " + elapsedTime);
    }
}

次の例では、 クラスを使用して Stopwatch パフォーマンス データを計算する方法を示します。

using System;
using System.Diagnostics;

namespace StopWatchSample
{
    class OperationsTimer
    {
        public static void Main()
        {
            DisplayTimerProperties();

            Console.WriteLine();
            Console.WriteLine("Press the Enter key to begin:");
            Console.ReadLine();
            Console.WriteLine();

            TimeOperations();
        }

        public static void DisplayTimerProperties()
        {
            // Display the timer frequency and resolution.
            if (Stopwatch.IsHighResolution)
            {
                Console.WriteLine("Operations timed using the system's high-resolution performance counter.");
            }
            else
            {
                Console.WriteLine("Operations timed using the DateTime class.");
            }

            long frequency = Stopwatch.Frequency;
            Console.WriteLine("  Timer frequency in ticks per second = {0}",
                frequency);
            long nanosecPerTick = (1000L*1000L*1000L) / frequency;
            Console.WriteLine("  Timer is accurate within {0} nanoseconds",
                nanosecPerTick);
        }

        private static void TimeOperations()
        {
            long nanosecPerTick = (1000L*1000L*1000L) / Stopwatch.Frequency;
            const long numIterations = 10000;

            // Define the operation title names.
            String [] operationNames = {"Operation: Int32.Parse(\"0\")",
                                           "Operation: Int32.TryParse(\"0\")",
                                           "Operation: Int32.Parse(\"a\")",
                                           "Operation: Int32.TryParse(\"a\")"};

            // Time four different implementations for parsing
            // an integer from a string.

            for (int operation = 0; operation <= 3; operation++)
            {
                // Define variables for operation statistics.
                long numTicks = 0;
                long numRollovers = 0;
                long maxTicks = 0;
                long minTicks = Int64.MaxValue;
                int indexFastest = -1;
                int indexSlowest = -1;
                long milliSec = 0;

                Stopwatch time10kOperations = Stopwatch.StartNew();

                // Run the current operation 10001 times.
                // The first execution time will be tossed
                // out, since it can skew the average time.

                for (int i=0; i<=numIterations; i++)
                {
                    long ticksThisTime = 0;
                    int inputNum;
                    Stopwatch timePerParse;

                    switch (operation)
                    {
                        case 0:
                            // Parse a valid integer using
                            // a try-catch statement.

                            // Start a new stopwatch timer.
                            timePerParse = Stopwatch.StartNew();

                            try
                            {
                                inputNum = Int32.Parse("0");
                            }
                            catch (FormatException)
                            {
                                inputNum = 0;
                            }

                            // Stop the timer, and save the
                            // elapsed ticks for the operation.

                            timePerParse.Stop();
                            ticksThisTime = timePerParse.ElapsedTicks;
                            break;
                        case 1:
                            // Parse a valid integer using
                            // the TryParse statement.

                            // Start a new stopwatch timer.
                            timePerParse = Stopwatch.StartNew();

                            if (!Int32.TryParse("0", out inputNum))
                            {
                                inputNum = 0;
                            }

                            // Stop the timer, and save the
                            // elapsed ticks for the operation.
                            timePerParse.Stop();
                            ticksThisTime = timePerParse.ElapsedTicks;
                            break;
                        case 2:
                            // Parse an invalid value using
                            // a try-catch statement.

                            // Start a new stopwatch timer.
                            timePerParse = Stopwatch.StartNew();

                            try
                            {
                                inputNum = Int32.Parse("a");
                            }
                            catch (FormatException)
                            {
                                inputNum = 0;
                            }

                            // Stop the timer, and save the
                            // elapsed ticks for the operation.
                            timePerParse.Stop();
                            ticksThisTime = timePerParse.ElapsedTicks;
                            break;
                        case 3:
                            // Parse an invalid value using
                            // the TryParse statement.

                            // Start a new stopwatch timer.
                            timePerParse = Stopwatch.StartNew();

                            if (!Int32.TryParse("a", out inputNum))
                            {
                                inputNum = 0;
                            }

                            // Stop the timer, and save the
                            // elapsed ticks for the operation.
                            timePerParse.Stop();
                            ticksThisTime = timePerParse.ElapsedTicks;
                            break;

                        default:
                            break;
                    }

                    // Skip over the time for the first operation,
                    // just in case it caused a one-time
                    // performance hit.
                    if (i == 0)
                    {
                        time10kOperations.Reset();
                        time10kOperations.Start();
                    }
                    else
                    {

                        // Update operation statistics
                        // for iterations 1-10000.
                        if (maxTicks < ticksThisTime)
                        {
                            indexSlowest = i;
                            maxTicks = ticksThisTime;
                        }
                        if (minTicks > ticksThisTime)
                        {
                            indexFastest = i;
                            minTicks = ticksThisTime;
                        }
                        numTicks += ticksThisTime;
                        if (numTicks < ticksThisTime)
                        {
                            // Keep track of rollovers.
                            numRollovers ++;
                        }
                    }
                }

                // Display the statistics for 10000 iterations.

                time10kOperations.Stop();
                milliSec = time10kOperations.ElapsedMilliseconds;

                Console.WriteLine();
                Console.WriteLine("{0} Summary:", operationNames[operation]);
                Console.WriteLine("  Slowest time:  #{0}/{1} = {2} ticks",
                    indexSlowest, numIterations, maxTicks);
                Console.WriteLine("  Fastest time:  #{0}/{1} = {2} ticks",
                    indexFastest, numIterations, minTicks);
                Console.WriteLine("  Average time:  {0} ticks = {1} nanoseconds",
                    numTicks / numIterations,
                    (numTicks * nanosecPerTick) / numIterations );
                Console.WriteLine("  Total time looping through {0} operations: {1} milliseconds",
                    numIterations, milliSec);
            }
        }
     }
}

注釈

インスタンスは Stopwatch 、1 つの間隔の経過時間、または複数の間隔にわたる経過時間の合計を測定できます。 一般的Stopwatchなシナリオでは、 メソッドをStart呼び出し、最終的に メソッドをStop呼び出してから、 プロパティを使用してElapsed経過時間をチェックします。

Stopwatchインスタンスが実行中または停止中です。を使用してIsRunning、 の現在の状態をStopwatch確認します。 経過時間の測定を開始するには を使用 Start し、経過時間の測定を停止するには を使用 Stop します。 、、または ElapsedTicksの各プロパティElapsedElapsedMillisecondsを使用して経過時間の値を照会します。 インスタンスの実行中または停止中に経過時間プロパティに対してクエリを実行できます。 経過時間プロパティは、 の実行中に着実に増加 Stopwatch し、インスタンスが停止しても一定のままです。

既定では、インスタンスの経過時間値は Stopwatch 、測定されたすべての時間間隔の合計と等しくなります。 の Start 各呼び出しは累積経過時間でカウントを開始します。を Stop 呼び出すたびに、現在の間隔の測定が終了し、累積経過時間の値が固定されます。 メソッドを Reset 使用して、既存 Stopwatch のインスタンスの累積経過時間をクリアします。

Stopwatch 、基になるタイマー メカニズムのタイマー ティックをカウントすることによって経過時間を測定します。 インストールされているハードウェアとオペレーティング システムが高解像度のパフォーマンス カウンターをサポートしている場合、 Stopwatch クラスはそのカウンターを使用して経過時間を測定します。 それ以外の場合、クラスは Stopwatch システム タイマーを使用して経過時間を測定します。 フィールドと IsHighResolution フィールドをFrequency使用して、タイミング実装の精度と解像度をStopwatch決定します。

クラスは Stopwatch 、マネージ コード内でのタイミング関連のパフォーマンス カウンターの操作を支援します。 具体的には、Frequencyアンマネージド Windows API と の代わりにフィールドとGetTimestampQueryPerformanceCounterメソッドをQueryPerformanceFrequency使用できます。

注意

マルチプロセッサ コンピューターでは、スレッドが実行されているプロセッサは関係ありません。 ただし、BIOS またはハードウェア抽象化レイヤー (HAL) のバグにより、異なるプロセッサで異なるタイミング結果を得ることができます。 スレッドのプロセッサ アフィニティを指定するには、 メソッドを使用します ProcessThread.ProcessorAffinity

コンストラクター

Stopwatch()

Stopwatch クラスの新しいインスタンスを初期化します。

フィールド

Frequency

1 秒あたりのタイマー刻みの数として、タイマーの頻度を取得します。 このフィールドは読み取り専用です。

IsHighResolution

タイマーが高解像力のパフォーマンス カウンターに基づいているかどうかを示します。 このフィールドは読み取り専用です。

プロパティ

Elapsed

現在のインスタンスで計測された経過時間の合計を取得します。

ElapsedMilliseconds

現在のインスタンスで計測された経過時間の合計を取得します (ミリ秒単位)。

ElapsedTicks

現在のインスタンスで計測された経過時間の合計を取得します (タイマー刻み)。

IsRunning

Stopwatch タイマーが実行中かどうかを示す値を取得します。

メソッド

Equals(Object)

指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。

(継承元 Object)
GetElapsedTime(Int64)

を使用して取得された値以降の startingTimestamp 経過時間を GetTimestamp()取得します。

GetElapsedTime(Int64, Int64)

を使用して取得した 2 つのタイムスタンプ間の経過時間を GetTimestamp()取得します。

GetHashCode()

既定のハッシュ関数として機能します。

(継承元 Object)
GetTimestamp()

タイマー機構の現在のタイマー刻み数を取得します。

GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
Reset()

タイマー間隔の計測を停止して、経過時間をゼロにリセットします。

Restart()

時間間隔の計測を停止し、経過時間をゼロにリセットして、経過時間の計測を開始します。

Start()

間隔の経過時間の計測を開始または再開します。

StartNew()

新しい Stopwatch インスタンスを初期化して、経過時間のプロパティをゼロに設定し、経過時間の計測を開始します。

Stop()

間隔の経過時間の計測を停止します。

ToString()

時刻を Elapsed 文字列として返します。

ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)

適用対象

製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

こちらもご覧ください