在编写我目前正在处理的程序时,我注意到性能有一些变化,并且想要检查我用来解释这个的一些循环中的计算时间。
我写了一个非常简单的程序,它在一个循环中进行简单的加法计算,并输出完成它所花费的时间,我发现有两个对我来说是无法解释的效果。
首先是代码:
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循环占用1000循环时间的1/5,即使它是计算量的1/10,也是100 Mio的原因。循环只需要1 Mio的50倍左右。循环即使它是计算量的100倍? 有没有人知道为什么时间(特别是对于100循环)在我启动程序后运行计算后发生变化然后保持不变?
答案 0 :(得分:3)
有没有解释为什么100循环占用1000循环时间的1/5,即使它是计算的1/10倍
你正在测量三个滴答,这是一个很短的时间。如果你碰巧遇到了一个上下文切换,你可能会失去更多的时间,即使你的线程已经立即再次安排。即使使用Stopwatch
,基本上也没有足够大的时间进行明智的测量。
有没有人知道为什么时间(特别是对于100循环)在启动程序后运行计算后发生变化然后保持不变?
我的猜测是它与JIT编译和/或垃圾收集有关。
这就是为什么通常基准测试首先进行“预热”,和他们测试了大量的工作,这样测试将花费合理的时间,平滑时间上的小问题。 / p>