いくつかの単体テストを行っているときに、DateTime.UtcNowで予期しない動作が発生しました。DateTime.Now/UtcNowを連続して呼び出すと、より正確なミリ秒の増分をキャプチャするのではなく、予想よりも長い時間間隔で同じ値を返すようです。
正確な時間測定を行うのにより適したストップウォッチクラスがあることは知っていますが、誰かがこの動作をDateTimeで説明できるかどうか知りたいですか?DateTime.Nowの正式な精度は文書化されていますか(たとえば、50ミリ秒以内に正確ですか)?なぜDateTime.Nowは、ほとんどのCPUクロックが処理できるものよりも精度が低くなりますか?たぶん、それは最も一般的な分母CPUのために設計されただけでしょうか?
public static void Main(string[] args)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
for (int i=0; i<1000; i++)
{
var now = DateTime.Now;
Console.WriteLine(string.Format(
"Ticks: {0}\tMilliseconds: {1}", now.Ticks, now.Millisecond));
}
stopwatch.Stop();
Console.WriteLine("Stopwatch.ElapsedMilliseconds: {0}",
stopwatch.ElapsedMilliseconds);
Console.ReadLine();
}