2013-03-13 3 views
0

La logique principale d'un outil utilitaire est en fonction comme ceci:System.DateTime.Now donne de mauvais résultats

private void Run() 
{ 
    DateTime startTime = DateTime.Now; 
    Prepare(); 
    Search(); 
    Process(); 
    DateTime endTime = DateTime.Now; 
    TimeSpan duration = endTime.Subtract(startTime); 
    Console.WriteLine("Run took {0:00}:{1:00}:{2:00}", 
     (int)duration.TotalHours, duration.Minutes, duration.Seconds); 
} 

Quand je lance ce que je peux voir de mes propres yeux, il prend au moins 5 secondes (Process() méthode Spews sortie de la console que je peux observer se passe pendant 5-6s). Mais il rapporte "Run a pris 00:00:01".

Je ne m'attends pas à ce que le temps ait une précision de l'ordre de la microseconde, mais pourquoi est-ce si totalement inexact ici?

Mise à jour: Après avis J'ai aussi couru un StopWatch sur la même période et comparé à la soustraction de deux DateTime, et aussi débogué le code. Les deux méthodes acceptent une fraction de seconde ... StopWatch dans le débogueur avait 1139 millisecondes. Mon hypothèse est que d'une manière ou d'une autre l'écriture de temps sur la console n'est pas incluse mais je n'ai aucun moyen de la sauvegarder (ou de la réfuter).

+1

Avez-vous essayé de le déboguer? –

+4

Je suppose que vous devriez utiliser un [Chronomètre] (http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch%28v=vs.80%29.aspx) et aussi jeter un coup d'oeil [ici ] (http://stackoverflow.com/questions/8754018/recommended-method-to-calculate-the-difference-between-two- timespans/8754105#8754105) – V4Vendetta

+1

Connaissez-vous la classe 'System.Diagnostics.Stopwatch' ? – spender

Répondre

2

Je doute que le problème est avec DateTime. Probablement, le programme a fini et a envoyé la sortie à la mémoire tampon de la console, qui prend son bon temps en l'affichant réellement. Ce que vous voyez est le décalage de sortie.

2

Pour devenir confiant dans ce que vous voyez est ce qui se passe vraiment, écrire pour l'amour de test:

DateTime startTime = DateTime.Now; 
Thread.Sleep(5000); 
DateTime endTime = DateTime.Now; 
TimeSpan duration = endTime.Subtract(startTime); 
Console.WriteLine("Run took {0:00}:{1:00}:{2:00}", 
     (int)duration.TotalHours, duration.Minutes, duration.Seconds); 

En outre, il est préférable d'utiliser Stopwatch classe pour vos

+0

Sur de plus longues courses il semble moins inexact. Je me demandais même si la console était en retard de quelques secondes sur l'édition actuelle du programme ... elle écrit beaucoup de lignes sur la console. Je vais peut-être comparer 'StopWatch' et voir si les mêmes résultats sont visibles. –

1

Pourquoi ne pas utiliser Chronomètre?

Stopwatch ss = new Stopwatch(); 
ss.Start(); 
// Some quantity of work..... 
ss.Stop(); 

Console.WriteLine("Elapsed time: {0}", ss.Elapsed.TotalMilliseconds); 
0
DateTime startTime = DateTime.Now; 
Thread.Sleep(5000); 
DateTime endTime = DateTime.Now; 
TimeSpan duration = endTime.Subtract(startTime); 
Console.WriteLine(duration.Seconds); 

copies "5". Etes-vous sûr que votre cas de test est ce qu'il est?

+0

Votre cas de test n'est pas le même que le mien. Ecrire quelques milliers de lignes à la console et chronométrer à la main Vs ce que le chronomètre vous dit et laissez-moi savoir ce que vous voyez? –

+0

@John oui, la console est en retard. – CodeCaster

+0

Merci. Cela semble assez concluant alors. –