我有一个时间测量的问题,这真的让我很困扰。我正在执行类似以下代码(在 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 编译来解释的。