我正在尝试对某些东西进行基准测试。我有一个循环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);}
2 回答
三国纷争
TA贡献1804条经验 获得超7个赞
for
几十年来我一直在使用这样的循环。而且我从来没有经历过,这样的for
-loop 是第一次迭代期间延迟的原因。
我对你的实施一无所知Thing
,但我很确定你延迟的原因就在那里。不在循环中。
临摹微笑
TA贡献1982条经验 获得超2个赞
将整个循环体复制到 “修复”之外为我
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);
}
我不太确定原因,但现在第一次迭代的运行时间更符合预期。
- 2 回答
- 0 关注
- 73 浏览
添加回答
举报
0/150
提交
取消