.NET TIPS

処理時間を正確に計測するには?[2.0のみ、C#、VB]

デジタルアドバンテージ 遠藤 孝信
2006/02/17

 あるコードの実行にかかる時間をプログラムで計測したい場合、.NET Framework 1.1ではDateTime構造体(System名前空間)で開始/終了の時刻を取得して算出したり、より正確に計測したい場合にはWin32APIのQueryPerformanceCounter関数*などを直接呼び出したりする必要があった。

* この関数を利用するには、ハードウェアが高分解能パフォーマンスカウンタをサポートしている必要がある。このため古いPCでは利用できない可能性もある。

 .NET Framework 2.0のクラス・ライブラリには、このQueryPerformanceCounter関数をベースにしたStopwatchクラス(System.Diagnostics名前空間)が新しく追加されており、正確な経過時間を簡単に計測できるようになっている。

Stopwatchクラス

 Stopwatchクラスで時間を計測するには、そのインスタンスを作成してStartメソッド、そしてStopメソッドを呼び出すだけだ(インスタンスの作成とStartメソッドの呼び出しをまとめて行う静的なStartNewメソッドも用意されている)。

 その経過時間は、ElapsedMillisecondsプロパティ(ミリ秒単位)、Elapsedプロパティ(TimeSpan構造体の値)、もしくはElapsedTicksプロパティ(タイマ刻み回数)から得ることができる。

 以下にStopwatchクラスを使用したサンプル・プログラムを示す。このプログラムでは、Threadクラス(System.Threading名前空間)のSleepメソッドにより1秒間だけスリープし、その実際の時間を計測してさまざまな形式で経過時間を出力する。

// stopwatch.cs

using System;
using System.Diagnostics;

class StopWatchSample {
  static void Main() {
    Stopwatch sw = new Stopwatch();

    sw.Start();
    System.Threading.Thread.Sleep(1000);
    sw.Stop();

    // ミリ秒単位で出力
    long millisec = sw.ElapsedMilliseconds;
    Console.WriteLine(millisec); // 出力例:998

    // TimeSpan構造体で書式付き表示
    TimeSpan ts = sw.Elapsed;
    Console.WriteLine(ts); // 出力例:00:00:00.9984668

    // 高分解能なタイマが利用可能か
    Console.WriteLine(Stopwatch.IsHighResolution); // 出力例:True

    // タイマ刻み回数
    long ticks = sw.ElapsedTicks;
    Console.WriteLine(ticks); // 出力例:2988141812

    // タイマの1秒あたりの刻み回数
    Console.WriteLine(Stopwatch.Frequency); // 出力例:2992730000

    // より詳細な秒数
    double sec = (double)sw.ElapsedTicks
                  / (double)Stopwatch.Frequency;
    Console.WriteLine(sec); // 出力例:0.998466888760429
  }
}

// コンパイル方法:csc stopwatch.cs
Stopwatchクラスを使用したC#のサンプル・プログラム(stopwatch.cs)

' stopwatch.vb

Imports System
Imports System.Diagnostics

Class StopWatchSample
  Shared Sub Main()
    Dim sw As New Stopwatch

    sw.Start()
    System.Threading.Thread.Sleep(1000)
    sw.Stop()

    ' ミリ秒単位で出力
    Dim millisec As Long = sw.ElapsedMilliseconds
    Console.WriteLine(millisec) ' 出力例:998

    ' TimeSpan構造体で書式付き表示
    Dim ts As TimeSpan = sw.Elapsed
    Console.WriteLine(ts) ' 出力例:00:00:00.9984668

    ' 高分解能なタイマが利用可能か
    Console.WriteLine(Stopwatch.IsHighResolution) ' 出力例:True

    ' タイマ刻み回数
    Dim ticks As Long = sw.ElapsedTicks
    Console.WriteLine(ticks) ' 出力例:2988141812

    ' タイマの1秒あたりの刻み回数
    Console.WriteLine(Stopwatch.Frequency) ' 出力例:2992730000

    ' より詳細な秒数
    Dim sec As Double = sw.ElapsedTicks / Stopwatch.Frequency
    Console.WriteLine(sec) ' 出力例:0.998466888760429
  End Sub
End Class

' コンパイル方法:vbc stopwatch.vb
Stopwatchクラスを使用したVBのサンプル・プログラム(stopwatch.vb)

 TimeSpan構造体(System名前空間)の扱いについては、「TIPS:秒数を「hh:mm:ss」形式の文字列にするには?」や「TIPS:日時や時間間隔の加減算を行うには?」を参考にしていただきたい。

 ElapsedTicksプロパティによって得られる「タイマ刻み回数」とは、計測中にタイマがカウントした回数である。タイマが1秒間に何回カウントできるかは、Stopwatchクラスの静的プロパティであるFrequencyプロパティから取得できる。上記のサンプル・プログラムでは、ElapsedTicksプロパティの値を、Frequencyプロパティの値で割り算することにより、より正確な秒数を算出している。

 なお、ハードウェアによりサポートされる高分解能パフォーマンスカウンタが利用可能かどうかはIsHighResolutionプロパティによりチェックできる。これが利用できない場合には、Stopwatchクラスは自動的にDateTime構造体の機能を利用して時間を計測する。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:クラス・ライブラリ 処理対象:日付と時刻
使用ライブラリ:Stopwatchクラス(System.Diagnostics名前空間)
使用ライブラリ:TimeSpan構造体(System名前空間)
使用ライブラリ:DateTime構造体(System名前空間)
関連TIPS:秒数を「hh:mm:ss」形式の文字列にするには?
関連TIPS:日時や時間間隔の加減算を行うには?

この記事と関連性の高い別の.NET TIPS
Stopwatchクラスで時間計測をリセットして再開するには?
秒数を「hh:mm:ss」形式の文字列にするには?
日時や時間間隔の加減算を行うには?
[Silverlight 2]タイマを利用するには?
タイマにより一定時間間隔で処理を行うには?(Windowsタイマ編)
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間