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

时间:2019-04-22 15:33:38

标签: c#

我正在尝试进行基准测试。

我有一个循环

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 个答案:

答案 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);
}

我不确定原因,但现在第一次迭代的运行时更像预期的那样。