1

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

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

首先是代码:

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

有没有解释为什么 100 循环需要大约 1000 循环时间的 1/5,即使它是计算量的 1/10 倍,以及为什么 100 Mio. 循环只需要大约 1 Mio 的 50 倍。循环,即使它是计算量的 100 倍?有没有人知道为什么我在启动程序后运行一次计算后时间(尤其是 100 循环)会发生变化,然后保持不变?

4

1 回答 1

3

有没有解释为什么 100 循环需要大约 1000 循环时间的 1/5,即使它是计算量的 1/10 倍

您正在测量三个滴答声,这是非常非常短的时间。如果您碰巧遇到了上下文切换,您可能会损失更多的时间,即使您的线程被立即再次安排。即使使用Stopwatch.

有没有人知道为什么我在启动程序后运行一次计算后时间(尤其是 100 循环)会发生变化,然后保持不变?

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

这就是为什么通常基准测试首先运行“热身”轮,并且他们测试合理的工作量,以便测试将花费合理的时间,平滑时间上的小颠簸。

于 2012-11-08T23:07:18.493 回答