在使用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 ║
╚═════════════════════════════════════════════════════════════════════════════════╝
有没有人知道这种时间变化?
答案 0 :(得分:4)
在处理器工作在纳秒级别的情况下,1毫秒不能提供足够的时间分辨率来分析代码。 Furthemore DateTime.Now.Milliseconds
实际上不是精确到1毫秒,如果你想要那种精度,你应该使用Stopwatch
。
最后,使用小的列表大小并不代表吞吐量,因为您没有考虑JIT优化所花费的时间以及执行垃圾收集时所有线程如何阻塞。
不要劝阻您,但我建议您阅读软件概要分析的原则,以便了解如何准确衡量代码的效果。
答案 1 :(得分:3)
似乎对我来说是线性的。我在y轴上绘制了你的时间,在x轴上绘制了你的循环迭代,它按照我的预期合理地线性出现。 R ^ 2值为0.996非常好。因此,根据此趋势线,无论迭代次数如何,您都需要大约0.352秒的开销,然后每次迭代爬升0.167秒。显然这些数字并不完美,但它们确实表现出初始开销,然后稳步攀升,而不是您认为的变化。