计算循环中的时间差异

时间:2012-11-08 23:01:27

标签: c# wpf loops time sum

在编写我目前正在处理的程序时,我注意到性能有一些变化,并且想要检查我用来解释这个的一些循环中的计算时间。

我写了一个非常简单的程序,它在一个循环中进行简单的加法计算,并输出完成它所花费的时间,我发现有两个对我来说是无法解释的效果。

首先是代码:

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;
    }
}

现在我可以观察到以下内容:

  1. 第一次启动程序后点击按钮并计算,只要我第二次运行它,短循环100需要大约两次/三次(6-9滴答)(2-4 )。之后它将保持大约相同的长度(2-4个滴答)。

  2. 循环时间之间有一些奇怪的比例,当我一直点击按钮时,这个比例保持不变,大致如下:

    • 100:3
    • 1000:15
    • 10000:150
    • 1000000:17000
    • 100000000:840000
  3. 有没有解释为什么100循环占用1000循环时间的1/5,即使它是计算量的1/10,也是100 Mio的原因。循环只需要1 Mio的50倍左右。循环即使它是计算量的100倍? 有没有人知道为什么时间(特别是对于100循环)在我启动程序后运行计算后发生变化然后保持不变?

1 个答案:

答案 0 :(得分:3)

  

有没有解释为什么100循环占用1000循环时间的1/5,即使它是计算的1/10倍

你正在测量三个滴答,这是一个很短的时间。如果你碰巧遇到了一个上下文切换,你可能会失去更多的时间,即使你的线程已经立即再次安排。即使使用Stopwatch,基本上也没有足够大的时间进行明智的测量。

  

有没有人知道为什么时间(特别是对于100循环)在启动程序后运行计算后发生变化然后保持不变?

我的猜测是它与JIT编译和/或垃圾收集有关。

这就是为什么通常基准测试首先进行“预热”,他们测试了大量的工作,这样测试将花费合理的时间,平滑时间上的小问题。 / p>