C#TimeSpan给出0作为TotalMilliseconds

时间:2017-01-08 22:28:57

标签: c#

我试图“基准”两个几乎相同的循环。当我逐个检查它们时,减法没有任何打嗝,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
    }
}

2 个答案:

答案 0 :(得分:3)

来自文档:

  

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

     

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

答案 1 :(得分: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
请注意,时间约为300 纳米