【问题标题】:Why does stopwatch tick longer when it is running the first time为什么秒表第一次运行时滴答声更长
【发布时间】:2012-12-28 05:05:10
【问题描述】:

我在一个 while 循环中运行这段代码大约 10000 次,我注意到 timeSpent 大约是 4,除了第一次,大约是 500,为什么?

Stopwatch s;
long price;
count = 10000;
while (count!=0)
{
   s = Stopwatch.StartNew();

   price = classA.Method(..some inputs...);  //this method do some iterations to return back a long given some inputs

   s.Stop();
   timeSpent = s.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L));
   s.Reset();
   /*write the price, timeSpent and inputs into a .txt file*/
   count--;
}

【问题讨论】:

  • 什么是 /* 函数调用 */?其中一个可能正在初始化某些东西。
  • 您不应该在循环之外启动秒表吗?
  • 即使它正在初始化一些东西,当它再次被调用时它会再次初始化不是吗?
  • 我怀疑你省略的函数调用是第一次被击中,你会看到使用 JIT 语言的成本。
  • 使用 Stopwatch.ElapsedMilliseconds 比使用 Ticks 自己计算要容易得多

标签: c# .net performance stopwatch


【解决方案1】:

第一次调用方法时,它会从 IL 编译为本机代码。任何后续调用都会重新使用生成的本机代码。所以,一般来说,你会期望你第一次调用一个方法花费的时间最长。

不幸的是,很难证明这是原因,但可能可以解释它。在进行基准测试/分析时,我已经多次看到同样的事情发生:第一次调用花费的时间最长。我通常通过丢弃第一次运行来解决这个问题。

当然,您调用的方法可能有副作用、获取资源并缓存它们,或者只是在第一次调用时才发生一次且仅发生的任何事情。这些只是我说这很难确定的部分原因。

【讨论】:

  • 或者其中一个类有静态构造函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 1970-01-01
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
相关资源
最近更新 更多