为了账号安全,请及时绑定邮箱和手机立即绑定

使循环中的第一次迭代与其余迭代速度相同

使循环中的第一次迭代与其余迭代速度相同

C#
守着星空守着你 2022-12-24 12:14:24
我正在尝试对某些东西进行基准测试。我有一个循环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,但我很确定你延迟的原因就在那里。不在循环中。


查看完整回答
反对 回复 2022-12-24
?
临摹微笑

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);

}

我不太确定原因,但现在第一次迭代的运行时间更符合预期。


查看完整回答
反对 回复 2022-12-24
  • 2 回答
  • 0 关注
  • 73 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信