在编写我目前正在处理的程序时,我注意到性能发生了一些变化,并想检查我用来解释这一点的某些循环中的计算时间。
我写了一个非常简单的程序,它在一个循环中进行简单的加法计算并输出它所花费的时间,我注意到目前有两个对我来说无法解释的效果。
首先是代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
int a = 1, b = 2, c = 0;
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 100; i++)
{
c += (a + b);
}
sw.Stop();
c = 0;
textBlock1.Text = 100 + ": " + sw.ElapsedTicks;
sw.Restart();
for (int i = 0; i < 1000; i++)
{
c += (a + b);
}
sw.Stop();
c = 0;
textBlock2.Text = 1000 + ": " + sw.ElapsedTicks;
sw.Restart();
for (int i = 0; i < 10000; i++)
{
c += (a + b);
}
sw.Stop();
c = 0;
textBlock3.Text = 10000 + ": " + sw.ElapsedTicks;
sw.Restart();
for (int i = 0; i < 1000000; i++)
{
c += (a + b);
}
sw.Stop();
c = 0;
textBlock4.Text = 1000000 + ": " + sw.ElapsedTicks;
sw.Restart();
for (int i = 0; i < 100000000; i++)
{
c += (a + b);
}
sw.Stop();
textBlock5.Text = 100000000 + ": " + sw.ElapsedTicks;
}
}
现在我可以观察到以下内容:
第一次启动程序单击按钮并计算后,100 的短循环大约需要两倍/三倍(6-9 滴答声),只要我第二次运行它(2-4)。之后,它将保持大约相同的长度(2-4 个刻度)。
循环时间之间存在奇怪的比例,当我继续单击按钮时,这些比例保持不变,如下所示:
- 100:3
- 1000:15
- 10000:150
- 1000000:17000
- 100000000: 840000
有没有解释为什么 100 循环需要大约 1000 循环时间的 1/5,即使它是计算量的 1/10 倍,以及为什么 100 Mio. 循环只需要大约 1 Mio 的 50 倍。循环,即使它是计算量的 100 倍?有没有人知道为什么我在启动程序后运行一次计算后时间(尤其是 100 循环)会发生变化,然后保持不变?