执行时间由两个不同的秒表测量

时间:2018-04-19 09:49:26

标签: c# performance stopwatch

我想分析方法Tuple<A,B,C,D> Calculate()的执行时间。

我所做的是以下内容:

Tuple<A, B, C, D, E>
Calculate(Line l, Path p)
{
    var stopwatch = new System.Diagnostics.Stopwatch();
    stopwatch.Start();

    var rv = Calculate2(l, p);

    System.Diagnostics.Debug.WriteLine($" stopwatch.ElapsedMilliseconds} ms;");
    }

    return rv;
}


Tuple<A, B, C, D, E>
Calculate2(Line l, Path p)
{
    var stopwatch = new System.Diagnostics.Stopwatch();
    stopwatch.Start();

    A a = ...; B b = ...; C c = ...; D d = ...; E e = ...
    ... content of this method

    System.Diagnostics.Debug.WriteLine($" stopwatch.ElapsedMilliseconds} ms;");

    return Tuple.Create(a,b,c,d,e);
}

第一次测量给出28 ms,第二次测量仅给出8 ms(每次) 这是否意味着return statement需要20毫秒? 我觉得这不可能相信......?

这不是Tuple - 问题:我尝试了一个struct tuple和一个显式类,结果完全相同。

EDIT
我在课堂上添加了一个静态秒表,发现在Calculate2(..)入口处,静态秒表显示延迟时间为20毫秒。

我想知道这是否与JIT对该方法的补充有关 我在第一次运行后又添加了第二次运行,并没有显示延迟 事实上,延迟是对该功能的第一次调用,出于其他原因,我认为第一次是瓶颈。

1 个答案:

答案 0 :(得分:-1)

Stopwatch sw = new Stopwatch();
sw.Start();
//do some work
Thread.Sleep(TimeSpan.FromSeconds(30));
sw.Stop();

var totalTimeElapsed = sw.Elapsed.TotalMilliseconds;
var milSecs = sw.ElapsedMilliseconds;

您需要使用Elapsed.TotalMilliseconds而不是ElapsedMilliseconds。 你可以找到一个很好的解释here

ElapsedMilliseconds可能会给您带来意想不到的结果。