web-dev-qa-db-fra.com

Calculatrice en millisecondes C #

J'ai besoin de chronométrer l'exécution d'une séquence de code écrite en C #. Utilisation de DateTime.Now Je reçois des valeurs incorrectes pour le champ milliseconde. Par exemple:

 int start_time, elapsed_time;

 start_time = DateTime.Now.Millisecond;

 for(int i = 0; i < N_ITER; i++) {
       // cpu intensive sequence
 }

 elapsed_time = DateTime.Now.Millisecond - start_time;

elapsed_time donne des valeurs négatives. 

Comment puis-je remplacer DateTime afin d'obtenir la valeur réelle du temps écoulé?

14
Sebi
using System.Diagnostics;

//...

var stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < N_ITER; i++) {
    // cpu intensive sequence
}
stopwatch.Stop();
elapsed_time = stopwatch.ElapsedMilliseconds;
60
RavingDev

Répondre EDITTED en ajoutant des commentaires.

Cette réponse tente uniquement de compter le nombre total de millisecondes écoulées entre deux fois, les temps étant directement dérivés de DATETIME.NOW. Selon la conversation, il est entendu que DATETIME.NOW est tolérable pour les influences extérieures. Par conséquent, la meilleure solution serait d’utiliser une propriété de classe Stopwatch. Suite à un lien qui pourrait mieux expliquer (à moi) et discuter de la performance entre DateTimeNow, DateTime.Ticks, StopWatch

Réponse originale

La façon dont vous le convertissez en int est le problème. Vous avez besoin d’une meilleure diffusion et d’éléments supplémentaires:) Cela peut sembler simple comparé à une minuterie efficace. Mais ça marche,

DateTime startTime, endTime;
startTime = DateTime.Now;

//do your work

endTime = DateTime.Now;
Double elapsedMillisecs = ((TimeSpan)(endTime - startTime)).TotalMilliseconds;

Il existe une référence sur le Web, vous pouvez également consulter:

référence

9
bonCodigo

Vous recherchez le chronomètre classe. Il est spécialement conçu pour ramener des mesures de temps de haute précision.

var stopwatch = new Stopwatch();

stopwatch.Start();
for (int i = 0; i < N_ITER; i++)
{
     // cpu intensive sequence
}
stopwatch.Stop();

var elapsed = stopwatch.ElapsedMilliseconds;
3
tmesser

DateTime.Millisecond ne renvoie que la fraction de milliseconde de la seconde, comprise entre 0 et 999. Vous devez tenir compte du reste de la date et de l'heure lors de la programmation.

Cependant, vous devriez envisager d'utiliser la classe StopWatch pour ces types de minutages de performances.

2
StuartLC

Voici ce que j'ai utilisé pour obtenir le temps nécessaire à un calcul simple:

class Program
{
    static void Main(string[] args)
    {
        Decimal p = 0.00001m;
        Decimal i = 0m;
        DateTime start = new DateTime();
        DateTime stop = new DateTime();

        for (i = p; i <= 5; i = i + p)
        {
            Console.WriteLine("result is: " + i);
            if (i==p) start = DateTime.Now;
            if (i==5) stop = DateTime.Now;
        }

        Console.WriteLine("Time to compute: " + (stop-start));

    }
}
0
Constantin Cabiniuc