4

我有一个非常具体的问题,我需要回答一个非常具体的性能测试。我将简化代码,使其更容易理解。

我做了很多计算(几千万),所有这些都是在本身不太长的循环中完成的,我需要总计算时间。然而,所有的计算都不是一个接一个地直接完成的,并且一些额外的代码“介于”每个循环之间。

我需要的是所有循环的总时间(包括声明和初始化 i、递增它以及与示例中的 100 进行比较)。为了测量我Stopwatch在每个循环之前直接开始并在循环之后直接停止它的时间。但这两个动作是否需要一些可能相关的时间?

例子:

Stopwatch sw = new Stopwatch();

sw.Start();
//how long does it now take until for loop is reached?
for(int i = 0; i < 100; i++)
{
    //some calculations
}
//how much time does it take to stop sw?
sw.Stop();

当然,如果所有循环都直接一个接一个地完成并不重要,我可以从第一个循环的开头开始并在最后一个循环的结尾停止,但这在这里是不可能的。

我知道这个问题非常具体,但我希望有人可以在这里帮助我,因为来自大约 5000 万个循环的重要时间可能会在某种程度上影响我的结果。

4

2 回答 2

4

我需要的正是所有循环的总时间。为了测量我在每个循环之前直接启动秒表并在循环之后直接停止它的时间。但这两个动作是否需要一些可能相关的时间?

它们需要一些时间——就像在每次循环迭代中的初始化i、增量以及与 100 的比较一样。在计算中几乎没有什么是瞬时的。

它是否相关是另一回事。除非您的计算非常微不足道,否则这在您的时间安排中不太可能很重要。您可以尝试为空循环计时,但 JIT 编译器可能会完全摆脱循环本身。

于 2012-11-18T18:45:08.823 回答
2

好吧,你可以试试这个并自己检查,在我的(性能很差的)计算机上,第一次执行大约需要 0.0006 毫秒,下一次执行大约需要 0.0001 毫秒。自己试试:

Stopwatch sw = new Stopwatch();
sw.Start();
sw.Stop();
TimeSpan ts = TimeSpan.FromTicks(sw.ElapsedTicks);
string elapsed = ts.TotalMilliseconds.ToString();
于 2012-11-18T18:50:44.967 回答