Environment.TickCountは、 GetTickCount() WinAPI関数に基づいています。ミリ秒単位ですが、実際の精度は約15.6ミリ秒です。したがって、より短い時間間隔を測定することはできません(または0になります)
注:戻り値はInt32であるため、このカウンターは約49。7日ごとにロールオーバーします。このような長い間隔を測定するために使用しないでください。
DateTime.Ticksは、 GetSystemTimeAsFileTime()WinAPI関数に基づいています。それは100ナノ秒(マイクロソコンドの10分の1)です。DateTime.Ticksの実際の精度は、システムによって異なります。XPでは、システムクロックの増分は約15.6ミリ秒で、Environment.TickCountの場合と同じです。Windows 7では、精度は1ミリ秒です(Environemnt.TickCountは15.6ミリ秒のままです)が、省電力スキームが使用されている場合(通常はラップトップで)、15.6ミリ秒まで低下する可能性があります。
StopwatchはQueryPerformanceCounter() WinAPI関数に基づいています(ただし、システムで高解像度のパフォーマンスカウンターがサポートされていない場合は、DateTime.Ticksが使用されます)
StopWatchを使用する前に、次の2つの問題に注意してください。
- マルチプロセッサシステムでは信頼できない可能性があります(MS kb895980、kb896256を参照) 。
- CPU周波数が変化すると、信頼性が低下する可能性があります(この記事を読んでください)
簡単なテストでシステムの精度を評価できます。
static void Main(string[] args)
{
int xcnt = 0;
long xdelta, xstart;
xstart = DateTime.UtcNow.Ticks;
do {
xdelta = DateTime.UtcNow.Ticks - xstart;
xcnt++;
} while (xdelta == 0);
Console.WriteLine("DateTime:\t{0} ms, in {1} cycles", xdelta / (10000.0), xcnt);
int ycnt = 0, ystart;
long ydelta;
ystart = Environment.TickCount;
do {
ydelta = Environment.TickCount - ystart;
ycnt++;
} while (ydelta == 0);
Console.WriteLine("Environment:\t{0} ms, in {1} cycles ", ydelta, ycnt);
Stopwatch sw = new Stopwatch();
int zcnt = 0;
long zstart, zdelta;
sw.Start();
zstart = sw.ElapsedTicks; // This minimizes the difference (opposed to just using 0)
do {
zdelta = sw.ElapsedTicks - zstart;
zcnt++;
} while (zdelta == 0);
sw.Stop();
Console.WriteLine("StopWatch:\t{0} ms, in {1} cycles", (zdelta * 1000.0) / Stopwatch.Frequency, zcnt);
Console.ReadKey();
}