How do you convert Stopwatch ticks to nanoseconds, milliseconds and seconds?

后端 未结 6 2012
悲哀的现实
悲哀的现实 2020-12-23 09:01

This is a very basic question...quite embarassing, but here goes:

I have a Stopwatch block in C# code. I determine the elapsed time in ticks and then want to conver

相关标签:
6条回答
  • 2020-12-23 09:37

    Stopwatch.Frequency gives you ticks/second.

    So, if you have ticks, you can just divide by frequency to get seconds:

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

    For example, you can do:

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

    Which, on my system, prints:

    3455650175.58075, 3455.65017558075, 3.45565017558075
    
    0 讨论(0)
  • 2020-12-23 09:41

    Use the Elapsed property:

    stopwatch.Elapsed.TotalMilliseconds
    
    0 讨论(0)
  • 2020-12-23 09:45

    According to MSDN, Frequency tells you the number of ticks per second. Therefore:

    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;
    
    0 讨论(0)
  • 2020-12-23 09:46

    Use this class:

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

    Then you can get the elapsed nanoseconds/microseconds just like this:

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

    For milliseconds you can use the ElapsedMilliseconds() method of Stopwatch.

    0 讨论(0)
  • 2020-12-23 09:52

    From the MSDN docs:

    Use the Frequency and IsHighResolution fields to determine the precision and resolution of the Stopwatch timing implementation.

    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 讨论(0)
  • 2020-12-23 09:53

    Stopwatch.Elapsed is a TimeSpan, so you can do 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);
    

    Output:

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

    Note that stopwatch.ElapsedMilliseconds returns a long and is thus only precise up to the millisecond, while stopwatch.Elapsed.TotalMilliseconds returns a double and has the same precision as stopwatch.ElapsedTicks, except it's easier to use. ILSpy shows that TimeSpan.TotalMilliseconds is computed using ticks anyway.

    0 讨论(0)
提交回复
热议问题