从内部功能看到的时间比从调用代码看到的时间低得多

时间:2011-11-10 16:52:21

标签: c# performance function-calls

我有时间测量的问题,这真的很困扰我。我正在执行类似下面的代码(在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毫秒... 133ms对于函数调用来说似乎很多(即使是10 params我给的是我的,或者说秒表精度(这应该是超精确的)。

你会如何解释这种时差?

note 1 :连续几次调用都会发生同样的事情:5次通话我得到133,81,72,75,75毫秒的差异

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

  • 6个对象
  • 一个struct数组(数组作为参考传递,对吗?)
  • 2 ref int
  • 1 out byte []
  • 1课外
  • 1 out of small size(< 25 bytes)

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

我也忘记了我提供了一些属性作为第一次必须构造的参数,因此第一次调用的50ms差异可以通过属性初始化和JIT编译来解释。

1 个答案:

答案 0 :(得分:0)

我的坏,这是一个属性调用属性做一些磁盘读取访问。我认为这是一个简单的成员,并没有足够深入。我接受了函数调用的调用,现在时间几乎相同(0-1毫秒,我猜这是日志记录)

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

道德的道德是:如果某些事情看起来很可疑,请始终将呼叫树看到最深层次!