62 votes

Comment convertir les ticks du chronomètre en nanosecondes, millisecondes et secondes?

C'est une question très basique ... assez embarrassante, mais voici:

J'ai un bloc Chronomètre en code C #. Je détermine le temps écoulé en ticks, puis je veux convertir en ns, ms, s. Je sais que la fréquence est fournie par la classe Stopwatch et qu’elle est requise pour la conversion.

Merci

86voto

RedFilter Points 84190

Stopwatch.Elapsed est un TimeSpan , vous pouvez donc 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
 

57voto

Zach Johnson Points 12062

Selon cette fréquence, la fréquence vous indique le nombre de ticks par seconde. Donc:

secondes = ticks / fréquence

ms = (ticks / fréquence) * 1000

nanosecondes = (ticks / fréquence) * 1000000000

20voto

Reed Copsey Points 315315

Chronomètre.Fréquence vous donne ticks / seconde.

Donc, si vous avez des tics, vous pouvez simplement diviser par fréquence pour obtenir des 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, imprime:

 3455650175.58075, 3455.65017558075, 3.45565017558075
 

7voto

Kornél Regius Points 686

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());
 

Pendant des millisecondes, vous pouvez utiliser la méthode ElapsedMilliseconds () du chronomètre.

5voto

John Weldon Points 19132

À partir de la MSDN docs:

L'utilisation de la Fréquence et de IsHighResolution champs pour déterminer la précision et de la résolution du Chronomètre calendrier de mise en œuvre.

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);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X