2010-02-24 8 views

Répondre

68

Stopwatch.Elapsed est un TimeSpan, de sorte que vous pouvez faire myStopwatch.Elapsed.TotalMilliseconds, myStopwatch.Elapsed.TotalSeconds, etc.

// Create new stopwatch 
Stopwatch stopwatch = new Stopwatch(); 

// Begin timing 
stopwatch.Start(); 

// Do something 
for (int i = 0; i < 1000; i++) 
{ 
    Thread.Sleep(1); 
} 

// Stop timing 
stopwatch.Stop(); 

// Write result 
Console.WriteLine("Time elapsed (s): {0}", stopwatch.Elapsed.TotalSeconds); 
Console.WriteLine("Time elapsed (ms): {0}", stopwatch.Elapsed.TotalMilliseconds); 
Console.WriteLine("Time elapsed (ns): {0}", stopwatch.Elapsed.TotalMilliseconds * 1000000); 

Sortie:

Time elapsed (s): 2.4976622 
Time elapsed (ms): 2497.6622 
Time elapsed (ns): 2497662200 

Remarque que stopwatch.ElapsedMilliseconds renvoie un long et est donc seulement précis à la milliseconde, alors que stopwatch.Elapsed.TotalMilliseconds retourne une double et a la même précision questopwatch.ElapsedTicks, sauf qu'il est plus facile à utiliser. ILSpy montre que TimeSpan.TotalMilliseconds est calculé en utilisant des ticks de toute façon.

+6

Ne vous donne pas nanosecondes, cependant, ce que l'OP a demandé ... –

+0

Mise à jour avec ns. – RedFilter

+18

C'est très inexact, cependant, car il va fournir NS arrondi au MS le plus proche. –

44

Selon MSDN, la fréquence vous indique le nombre de tiques par seconde. Par conséquent:

Stopwatch sw = new Stopwatch(); 
// ... 
double ticks = sw.ElapsedTicks; 
double seconds = ticks/Stopwatch.Frequency; 
double milliseconds = (ticks/Stopwatch.Frequency) * 1000; 
double nanoseconds = (ticks/Stopwatch.Frequency) * 1000000000; 
+2

1) 'sw.ElapsedTicks' renvoie' long' 2) cast ticks à 'double' ou' decimal' avant divisé par 'Frequency' – Timeless

2

Utilisez la propriété Elapsed:

stopwatch.Elapsed.TotalMilliseconds 
4

De l'MSDN docs:

Utilisez les champs Frequency et IsHighResolution pour déterminer la précision et la résolution de la mise en œuvre de chronométrage.

long frequency = Stopwatch.Frequency; 
Console.WriteLine(" Timer frequency in ticks per second = {0}", 
    frequency); 
long nanosecPerTick = (1000L*1000L*1000L)/frequency; 
Console.WriteLine(" Timer is accurate within {0} nanoseconds", 
    nanosecPerTick); 
0

Si vous obtenez le temps écoulé depuis le chronomètre il y a des propriétés de l'objet timespan pour obtenir seconde, moulin ou autre.

TimeSpan ts = stopWatch.Elapsed; 
int seconds = ts.FromSeconds; 
int mill = ts.FromMiliseconds; 
13

Stopwatch.Frequency donne des ticks/seconde.

Donc, si vous avez les tiques, vous pouvez simplement diviser par fréquence pour obtenir secondes:

long ticks = sw.ElapsedTicks; 
double ns = 1000000000.0 * (double)ticks/Stopwatch.Frequency; 
double ms = ns/1000000.0; 
double s = ms/1000; 

Par exemple, vous pouvez faire:

static void Main() 
{ 
    Stopwatch sw = new Stopwatch(); 
    sw.Start(); 
    System.Threading.Thread.Sleep(3456); 
    sw.Stop(); 

    long ticks = sw.ElapsedTicks; 
    double ns = 1000000000.0 * (double)ticks/Stopwatch.Frequency; 
    double ms = ns/1000000.0; 
    double s = ms/1000; 

    Console.WriteLine("{0}, {1}, {2}", ns, ms, s); 
    Console.ReadKey(); 
} 

qui, sur mon système, impressions:

3455650175.58075, 3455.65017558075, 3.45565017558075 
+1

So 1ns correspond à 1000000000s. Cela ne semble pas juste. :) –

6

Utilisez cette classe:

public static class Utility 
{ 
    public static long ElapsedNanoSeconds(this Stopwatch watch) 
    { 
     return watch.ElapsedTicks * 1000000000/Stopwatch.Frequency; 
    } 
    public static long ElapsedMicroSeconds(this Stopwatch watch) 
    { 
     return watch.ElapsedTicks * 1000000/Stopwatch.Frequency; 
    } 
} 

Ensuite, vous pouvez obtenir les nanosecondes/microsecondes écoulées comme ceci:

var stopwatch = Stopwatch.StartNew(); 
//... measured code part 
Console.WriteLine(stopwatch.ElapsedNanoSeconds()); 
// OR 
Console.WriteLine(stopwatch.ElapsedMicroSeconds()); 

Pour millisecondes, vous pouvez utiliser la méthode ElapsedMilliseconds() de Chronomètre.

Questions connexes