你如何将秒表刻度转换为纳秒,毫秒和秒?

Sco*_*ies 60 c#

这是一个非常基本的问题......非常令人尴尬,但这里有:

我有一个C#代码的秒表块.我以刻度确定经过的时间,然后想要转换为ns,ms,s.我知道频率是由秒表类提供的,并且它是转换所必需的.

谢谢

Red*_*ter 84

Stopwatch.Elapsed是一个时间跨度,所以你可以做myStopwatch.Elapsed.TotalMilliseconds,myStopwatch.Elapsed.TotalSeconds等等.

// 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);
Run Code Online (Sandbox Code Playgroud)

输出:

Time elapsed (s): 2.4976622
Time elapsed (ms): 2497.6622
Time elapsed (ns): 2497662200
Run Code Online (Sandbox Code Playgroud)

注意的是stopwatch.ElapsedMilliseconds返回long,因此只精确到毫秒,而stopwatch.Elapsed.TotalMilliseconds回报double具有相同的精度stopwatch.ElapsedTicks,但它更容易使用.ILSpy显示TimeSpan.TotalMilliseconds无论如何都使用滴答计算.

  • 但是,这是非常不准确的,因为它会将NS四舍五入到最近的MS. (21认同)
  • 不,不是,毫秒是双倍(参见我添加的输出). (17认同)

Zac*_*son 55

根据MSDN,频率告诉你每秒的滴答数.因此:

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;
Run Code Online (Sandbox Code Playgroud)

  • 1)`sw.ElapsedTicks`返回`long` 2)cast ticks为`double`或`decimal`,然后除以`Frequency` (7认同)

Ree*_*sey 20

Stopwatch.Frequency给你滴答/秒.

所以,如果你有蜱虫,你可以按频率除以获得秒数:

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

例如,你可以这样做:

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();
}
Run Code Online (Sandbox Code Playgroud)

在我的系统上打印:

3455650175.58075, 3455.65017558075, 3.45565017558075
Run Code Online (Sandbox Code Playgroud)

  • 因此1ns对应于1000000000.这似乎不对.:) (2认同)

Kor*_*ius 7

使用这个类:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样得到经过的纳秒/微秒:

var stopwatch = Stopwatch.StartNew();
//... measured code part
Console.WriteLine(stopwatch.ElapsedNanoSeconds());
// OR
Console.WriteLine(stopwatch.ElapsedMicroSeconds());
Run Code Online (Sandbox Code Playgroud)

对于毫秒,您可以使用秒表的ElapsedMilliseconds()方法.

  • 注意溢出!可能最好将 ElapsedTicks 除以频率(转换为双倍),然后乘以常数。 (4认同)

Joh*_*don 5

来自MSDN文档:

使用FrequencyIsHighResolution字段确定秒表计时实施的精度和分辨率.

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);
Run Code Online (Sandbox Code Playgroud)