我正在尝试进行基准测试。
我有一个循环
for (int i = 1; i <= 1000; i++)
{
Thing thing = createThing(i);
DateTime startTime = DateTime.Now;
thing.ComputationallyExpensiveOp();
TimeSpan elapsed = DateTime.Now - startTime;
Console.WriteLine(String.Format("i = " + i + "\ttime = " + elapsed.TotalMilliseconds);
}
根据其他迭代完成的时间,第一个迭代i = 1
看起来比它需要的时间(几个数量级)要长得多。
第二次迭代似乎也很长,尽管不太明显。
我觉得这是因为循环会导致很多值的缓存,而这些值在第一次迭代中就没有设置。
有没有一种方法可以使第一个迭代i = 1
与其他迭代一样“快速”(从头顶方向),因此我确实只对 进行计时(尽可能最佳)thing.ComputationallyExpensiveOp()
。
目前,很明显,第一次迭代并不是thing.ComputationallyExpensiveOp()
的准确反映。
我已经尝试将“热身”初始化移到循环上方,但这没有用。
Thing thing = createThing(1);
thing.ComputationallyExpensiveOp();
for (int i = 1; i <= 1000; i++)
{
thing = createThing(i);
DateTime startTime = DateTime.Now;
thing.ComputationallyExpensiveOp();
TimeSpan elapsed = DateTime.Now - startTime;
Console.WriteLine(String.Format("i = " + i + "\ttime = " + elapsed.TotalMilliseconds);
}
答案 0 :(得分:1)
几十年来,我一直在使用这样的for
循环。而且我从未经历过这样的for
循环是第一次迭代过程中延迟的原因。
我对您的Thing
实现一无所知,但我可以肯定造成延迟的原因就在这里。不在循环中。
答案 1 :(得分:0)
将整个 循环体复制到外部为我“固定”
Thing thing = createThing(1);
DateTime startTime = DateTime.Now;
thing.ComputationallyExpensiveOp();
TimeSpan elapsed = DateTime.Now - startTime;
Console.WriteLine(String.Format("i = " + 1 + "\ttime = " + elapsed.TotalMilliseconds);
for (int i = 1; i <= 1000; i++)
{
thing = createThing(i);
startTime = DateTime.Now;
thing.ComputationallyExpensiveOp();
elapsed = DateTime.Now - startTime;
Console.WriteLine(String.Format("i = " + i + "\ttime = " + elapsed.TotalMilliseconds);
}
我不确定原因,但现在第一次迭代的运行时更像预期的那样。