为什么循环在迭代最小时显示低迭代率

时间:2014-08-02 05:06:59

标签: vb.net loops

在使用Do Until .. Loop进行一些实验时,我注意到迭代率根据迭代次数而变化。请考虑以下代码和计算:

Dim tim As Double
Dim i As Integer = 0
tim = Now.Millisecond
Do Until i > 500
ListBox1.Items.Add(i.ToString)
i = i + 1
Loop
MsgBox(Now.Millisecond - tim)

计算,执行时​​间和费率将在下面讨论:

╔═════════════════════════════════════════════════════════════════════════════════╗
║     Count       Time Taken(Ms)        Rate(iterations/Ms)                       ║
╠═════════════════════════════════════════════════════════════════════════════════╣
║       2             1                      0.5                                  ║
║       10            2                      0.2                                  ║
║       25            3                      0.12                                 ║
║       50            7                      0.14                                 ║
║      100           18                      0.18                                 ║
║      250           46                      0.184                                ║
║      500           82                      0.164                                ║
╚═════════════════════════════════════════════════════════════════════════════════╝

有没有人知道这种时间变化?

  • 影响迭代率的因素有哪些?

2 个答案:

答案 0 :(得分:4)

在处理器工作在纳秒级别的情况下,1毫秒不能提供足够的时间分辨率来分析代码。 Furthemore DateTime.Now.Milliseconds实际上不是精确到1毫秒,如果你想要那种精度,你应该使用Stopwatch

最后,使用小的列表大小并不代表吞吐量,因为您没有考虑JIT优化所花费的时间以及执行垃圾收集时所有线程如何阻塞。

不要劝阻您,但我建议您阅读软件概要分析的原则,以便了解如何准确衡量代码的效果。

答案 1 :(得分:3)

似乎对我来说是线性的。我在y轴上绘制了你的时间,在x轴上绘制了你的循环迭代,它按照我的预期合理地线性出现。 R ^ 2值为0.996非常好。因此,根据此趋势线,无论迭代次数如何,您都需要大约0.352秒的开销,然后每次迭代爬升0.167秒。显然这些数字并不完美,但它们确实表现出初始开销,然后稳步攀升,而不是您认为的变化。

Chart Data