正確な時刻管理は、イベントのログ記録からパフォーマンス測定まで、さまざまなプログラミングタスクにとって非常に重要です。秒単位で十分な場合もありますが、多くのアプリケーションでは、正確なタイミングのためにミリ秒単位の精度が求められます。この記事では、C#でこれを達成する方法について説明します。
目次
C#における日付と時刻の基本
C#は、DateTime
構造体とDateTimeOffset
構造体を介して、堅牢な日付と時刻の処理を提供します。これらには、日付と時刻の情報を操作するためのさまざまなプロパティとメソッドが用意されています。ただし、ミリ秒に直接アクセスするには、これらのツールの深い理解が必要です。
C#でのミリ秒の扱い
中心となる概念は、Ticks
プロパティの理解にあります。DateTime
構造体は時点を表し、Ticks
は100ナノ秒単位で、0001年1月1日午前0時0分0秒からの経過時間を返します。ミリ秒を取得するには、Ticks
値をTimeSpan.TicksPerMillisecond
(10,000)で割ります。
実践例:ミリ秒の取得
方法1:DateTime.Now.Ticks
の使用
これは、現在の時刻をミリ秒単位で取得するための最も簡単な方法です。
using System;
public class MillisecondsExample
{
public static void Main(string[] args)
{
long ticks = DateTime.Now.Ticks;
long milliseconds = ticks / TimeSpan.TicksPerMillisecond;
Console.WriteLine($"現在の時刻(ミリ秒):{milliseconds}");
}
}
方法2:経過時間の計測にStopwatch
を使用
Stopwatch
クラスは経過時間の計測に優れており、DateTime.Now
を直接使用する場合と比較して、短い期間の精度が高くなります。これは、パフォーマンスベンチマークに最適です。
using System;
using System.Diagnostics;
public class StopwatchExample
{
public static void Main(string[] args)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
// 計測するコード…
System.Threading.Thread.Sleep(500); // 作業のシミュレーション
stopwatch.Stop();
long milliseconds = stopwatch.ElapsedMilliseconds;
Console.WriteLine($"経過時間(ミリ秒):{milliseconds}");
}
}
方法3:高解像度タイマー(高度なニーズの場合)
極めて高い精度が必要な場合は、QueryPerformanceCounter
APIを検討してください。ただし、これはプラットフォームに依存し、精度はハードウェアによって異なります。マイクロ秒またはナノ秒の精度が必要な場合を除き、一般的には必要ありません。
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
public class HighResolutionTimerExample
{
public static void Main(string[] args)
{
long frequency;
long startTime;
long endTime;
QueryPerformanceFrequency(out frequency);
QueryPerformanceCounter(out startTime);
// 計測するコード…
System.Threading.Thread.Sleep(500); // 作業のシミュレーション
QueryPerformanceCounter(out endTime);
long elapsedTicks = endTime - startTime;
double elapsedMilliseconds = (double)elapsedTicks / frequency * 1000;
Console.WriteLine($"経過時間(ミリ秒):{elapsedMilliseconds}");
}
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceFrequency(out long lpFrequency);
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
}
適切な方法の選択
アプリケーションのニーズに最適な方法を選択してください。ほとんどのシナリオでは、DateTime.Now.Ticks
またはStopwatch
で十分な精度が得られます。極めて高い精度(マイクロ秒またはナノ秒)が絶対に必要な場合にのみ、QueryPerformanceCounter
を使用してください。