Właśnie napotkałem nieoczekiwane zachowanie z DateTime.UtcNow podczas wykonywania niektórych testów jednostkowych. Wydaje się, że gdy wywołujesz DateTime.Now/UtcNow w krótkich odstępach czasu, wydaje się, że zwraca tę samą wartość przez dłuższy niż oczekiwany przedział czasu, zamiast przechwytywać dokładniejsze przyrosty milisekund.
Wiem, że istnieje klasa Stopwatch, która lepiej nadawałaby się do wykonywania precyzyjnych pomiarów czasu, ale byłem ciekaw, czy ktoś mógłby wyjaśnić to zachowanie w DateTime? Czy istnieje udokumentowana oficjalna dokładność dla DateTime.Now (na przykład z dokładnością do 50 ms?)? Dlaczego DateTime.Now miałoby być mniej precyzyjne niż te, z którymi radzi sobie większość zegarów procesora? Może jest po prostu zaprojektowany dla procesora z najniższym wspólnym mianownikiem?
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();
}