単体テストを行っているときに、DateTime.UtcNow で予期しない動作に遭遇しました。DateTime.Now/UtcNow を立て続けに呼び出すと、より正確なミリ秒の増分を取得するのではなく、予想よりも長い時間間隔で同じ値を返すように見えます。
正確な時間測定に適した Stopwatch クラスがあることは知っていますが、誰かが 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();
}