3

我有一个时间测量的问题,这真的让我很困扰。我正在执行类似以下代码(在 C# 中):

Stopwatch sw = Stopwatch.StartNew();
Foo(args);
sw.Stop();
//log time

public void Foo(var args)
{
    Stopwatch sw = Stopwatch.StartNew();
    //do stuff
    sw.Stop();
    //log time
}

结果是两次之间的巨大差异,我的代码给了我:函数内部 15535 毫秒,外部 15668 毫秒......对于函数调用,133 毫秒对我来说似乎很多(即使我有 10 个参数)给我的),或证明秒表精度(应该是超精确的)。

您如何解释这种时间差异?

注意 1:在几个连续的呼叫中会发生同样的事情:5 次呼叫我得到 133、81、72、75、75 毫秒的差异

注2:我的函数的实际参数是:

  • 6类对象
  • 一个结构数组(该数组作为引用传递,对吗?)
  • 2 参考整数
  • 1个字节[]
  • 1班
  • 1 个小尺寸结构(< 25 字节)

更新:在 Release 中,第一次调用的差异更大(JIT 编译在 release 中更昂贵,这可以解释吗?),接下来的步骤有相同的开销(~75 ms)我试图在外面初始化秒表,传递一个作为参数并在函数之外记录,差异仍然存在。

我也忘记了我将一些属性作为必须在第一次构造的参数,所以第一次调用的 50ms 差异可能是由属性初始化和 JIT 编译来解释的。

4

1 回答 1

0

我的错,这是一个调用属性的属性,做一些磁盘读取访问。我认为这是一个简单的成员,并没有深入。我从函数调用中取出调用,现在时间几乎相同(0-1 ms,我猜是日志记录)

寓意是:属性不应该有副作用。如果您创建的属性没有做明显的事情,请改为编写函数,或者至少警告下一个开发人员您在属性文档中所做的事情!

道德的寓意是:如果某事看起来可疑,请始终将调用树看得最深!

于 2011-11-16T14:15:26.877 回答