【问题标题】:C# TimeSpan gives 0 as TotalMilliseconds [duplicate]C# TimeSpan 给出 0 作为 TotalMilliseconds [重复]
【发布时间】:2017-01-08 22:28:56
【问题描述】:

我试图对两个几乎相同的循环进行“基准测试”。当我一一检查它们时,减法没有任何问题,并且 TimeSpan 以 TotalMilliseconds 的形式返回正确的数字。当我将两个循环一起进行基准测试时,第一个减法返回一个 3 - 4 之间的数字(应该是正确的),第二个总是返回 0。我做错了什么?谢谢!

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(":: Simple for ::");

        var a = 0;
        var start = DateTime.Now;

        for (int i = 0; i < 10; i++)
        {
            a += i;
        }

        Console.WriteLine("Elapsed time: {0} ms", (DateTime.Now - start).TotalMilliseconds); // 3 - 4 ms
        Console.WriteLine(":: Fancy for ::");

        a = 0;
        start = DateTime.Now;

        foreach (var i in Enumerable.Range(0, 9))
        {
            a += i;
        }

        Console.WriteLine("Elapsed time: {0} ms", (DateTime.Now - start).TotalMilliseconds); // 0 ms
    }
}

【问题讨论】:

标签: c#


【解决方案1】:

来自文档:

此属性的分辨率取决于系统计时器,在 Windows 系统上约为 15 毫秒。因此,在很短的时间间隔内(例如在循环中)重复调用 Now 属性可能会返回相同的值.

Now 属性经常用于衡量性能。但是,由于其分辨率低,不适合用作基准测试工具。更好的选择是使用 Stopwatch 类。

【讨论】:

    【解决方案2】:

    尝试使用专为基准测试设计的Stopwatch 类:

      Stopwatch timer = new Stopwatch();
    
      timer.Start();
    
      for (int i = 0; i < 10; i++)
      {
          a += i;
      }
    
      timer.Stop();
    
      Console.WriteLine($"Elapsed time: {timer.Elapsed}");
    

    结果(.Net 4.6 IA-64,Core i7 3.2 GHz)

      00:00:00.0000003
    

    请注意,时间大约是 300nano

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-13
      • 2015-04-09
      • 2016-07-24
      • 2012-07-31
      • 2018-01-14
      • 2018-01-12
      • 2011-12-08
      • 2012-09-10
      相关资源
      最近更新 更多