2012-11-18 30 views
4

我有一个非常具体的问题,我需要回答一个非常具体的性能测试。我将简化代码,使其更易于理解。是否需要一些时间来启动和停止秒表?

我做了很多计算(几千万),都在循环中完成,它们本身不会太长,我需要总计算时间。然而,所有的计算都不是一个接一个地直接完成,而是在每个循环之间插入一些额外的代码。我所需要的,完全是所有循环的总时间(包括声明和初始化i,增加它,并与exmaple中的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(); 

当然它不会真的重要,如果所有的循环中直接完成了一个又一个,我刚开始在第一循环的开始和结束时停止最后一个,但这在这里是不可能的。

我知道这个问题很具体,但我希望有人能帮助我,因为来自五千万个循环的重要时间可能会影响我的结果。

回答

2

那么,你可以尝试一下,自己检查一下,在我的(糟糕的表演)计算机上,第一次执行约0.0006毫秒,下一次执行约0.0001毫秒。尝试一下:

Stopwatch sw = new Stopwatch(); 
sw.Start(); 
sw.Stop(); 
TimeSpan ts = TimeSpan.FromTicks(sw.ElapsedTicks); 
string elapsed = ts.TotalMilliseconds.ToString(); 
+0

感谢提到StopWatch-Stopwatch的错字。我只是习惯使用秒表StopWatch =新秒表();'和某种方式使用大写W. 到你的答案:谢谢,我曾想过这样做,但认为,这可能是“一个不同的情况”。然而,作为一个检查,我可能会运行你的代码几千次,并在一段时间内平均。 – phil13131

4

我需要什么,完全是所有循环的总时间。要测量时间,我在每个循环之前直接启动StopWatch,并在循环之后直接停止它。但是,这两个行动需要一些可能相关的时间吗?

他们需要一些时间 - 如初始化i和增量,并在每次循环迭代中与100进行比较。计算中几乎没有什么是瞬时

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

+0

除了达到for-loop的实际时间外,一切都是相关的(初始化i,增量,比较)。这些计算是相当简单的(有时候只是一些补充),有时循环很短(大约10次迭代)。 我以为这是暗示,我会更新我的问题。 – phil13131

+0

@ phil13131:在这一点上,很难得到任何真正的表现。正如我所说的,你可以*尝试*空循环 - 或者尝试最小的非平凡操作,避免JIT编译器优化它 - 找到基础结果。但基本上,这听起来像答案是,“是的,这些行动需要一段时间。”请注意,如果您事先调用'Start'和'Stop'方法(可能在不同的实例上),它们将会被JIT编译。 (否则,JIT编译可能是你测量的一部分......) –

+0

谢谢你提到JIT编译,但是当你到达'sw.Start()'的方法时,不应该在那时代码已经编译? – phil13131

相关问题