【问题标题】:What is Best way to calculate time span计算时间跨度的最佳方法是什么
【发布时间】:2011-12-29 06:49:21
【问题描述】:

在我的 c# 程序中,我的要求是计算在 foreach 循环中的业务逻辑执行的时间跨度,我必须存储时间跨度。

我正在使用以下代码

for (int i = 0; i < 100; i++)
{
    DateTime start= DateTime.Now; 
    // Business logic
    DateTime end= DateTime.Now; 
    TimeSpan time = start.Subtract(end);
    // Save timespan in log file
}

请纠正我是否使用了正确的代码,或者我是否需要修改以获得更好的性能和结果。

【问题讨论】:

标签: c# datetime timespan


【解决方案1】:

您应该使用StopwatchStopwatch 的时间测量比挂钟准确得多。

var sw = Stopwatch.StartNew();
// business logic
sw.Stop();
TimeSpan time = sw.Elapsed;

【讨论】:

  • 谢谢,很好的信息,还有两个问题 1. 因为我正在使用 for 循环,因此不需要每次都在循环内创建 Stopwatch 实例(对吗?) 2. 我希望总时间花在如果小于 1 分钟,则为秒,如果大于 1 分钟,则以分钟为单位,有任何相关信息吗?
【解决方案2】:

最简单的方法是:

TimeSpan time = DateTime.Now - start;

或者,您可以使用秒表来提供更准确的结果。请参阅http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx 了解如何使用秒表。

【讨论】:

    【解决方案3】:

    您似乎正在使用时间跨度来衡量性能。您的代码很好,但是您应该知道 DateTimes 非常精确(在大多数机器上大约为 10-15 毫秒 - 请参阅“无用计时器机制”部分 here 了解说明)。

    日期时间也不连续;如果在夏令时开始之前检索第一个 DateTime ,而后一个 DateTime 在之后检索呢?需要一秒钟的操作可能会显示为需要一个小时,甚至是负时间。即使所有时间都是 UTC,当用户手动更改时间,或者由于计算机进入睡眠和唤醒等导致的跳跃等时,也存在潜在的问题。

    更好的选择是使用Stopwatch class,它专为此类事情而设计,并在内部使用高精度计时器(通过QueryPerformanceCounter() Win32 函数)。

    【讨论】:

      【解决方案4】:

      要回答您的后续问题,(1) 您是正确的,您不需要每次迭代都重新实例化 StopWatch。你只需要使用重启方法,像这样:

      Stopwatch sw = new Stopwatch();
      sw.Start(); // To initialize
      for (int i = 0; i < 100; i++)
      {
          sw.Restart();
          // Business logic 
          TimeSpan time = sw.Elapsed;
          // Save timespan in log file
      }
      

      (2) 如果小于一分钟,您可能需要编写几行代码以秒为单位返回值,如果大于一分钟,则以分钟为单位,但这里是一个这样做的示例(假设这是行从上面的例子中保存时间跨度之后):

      TimeSpan time = sw.Elapsed;
      int iSecondsOrMinutes = time.TotalSeconds < 60 ? time.Seconds : (int)time.TotalMinutes;
      

      此示例使用Ternary Operator 来保存整数的分钟数或秒数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-13
        • 1970-01-01
        • 2020-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-26
        • 2015-08-21
        相关资源
        最近更新 更多