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

我正在尝试对某些东西进行基准测试。


我有一个循环


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

}


守着星空守着你
浏览 74回答 2
2回答

三国纷争

for几十年来我一直在使用这样的循环。而且我从来没有经历过,这样的for-loop 是第一次迭代期间延迟的原因。我对你的实施一无所知Thing,但我很确定你延迟的原因就在那里。不在循环中。

临摹微笑

将整个循环体复制到 “修复”之外为我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++){&nbsp; &nbsp; thing = createThing(i);&nbsp; &nbsp; startTime = DateTime.Now;&nbsp; &nbsp; thing.ComputationallyExpensiveOp();&nbsp; &nbsp; elapsed = DateTime.Now - startTime;&nbsp; &nbsp; Console.WriteLine(String.Format("i = " + i + "\ttime = " + elapsed.TotalMilliseconds);}我不太确定原因,但现在第一次迭代的运行时间更符合预期。
打开App,查看更多内容
随时随地看视频慕课网APP