1

現在取り組んでいるプログラムを書いているときに、パフォーマンスの変化に気づき、これを説明するために使用しているいくつかのループの計算時間を確認したいと思いました。

ループ内で単純な加算計算を実行し、それを実行するのにかかった時間を出力する非常に単純なプログラムを作成しましたが、現時点では説明できない影響が2つあることに気付きました。

最初のコード:

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の短いループは、2回目の実行(2-4)の約2/3回(6-9ティック)かかります。その後、ほぼ同じ長さ(2〜4ティック)のままになります。

  2. ループ時間の間には奇妙な比率があり、ボタンをクリックし続けると次のようになります。

    • 100:3
    • 1000:15
    • 10000:150
    • 1000000:17000
    • 100000000:840000

計算回数が1/10倍なのに、100ループが1000ループの1/5の時間になる理由と、100Mioがかかる理由はありますか。ループは1Mioの約50倍の長さしかかかりません。計算数が100倍なのにループしますか?そして、プログラムの開始後に一度計算を実行した後、時間(特に100ループの場合)が変化し、その後はかなり一定のままである理由を誰かが知っていますか?

4

1 に答える 1

3

計算回数が1/10倍なのに、100ループが1000ループの1/5程度かかる理由はありますか?

あなたはごくわずかな時間である3ティックを測定しています。たまたまコンテキストスイッチに遭遇した場合、スレッドがすぐに再度スケジュールされたとしても、おそらくそれよりもはるかに多くの時間を失うことになります。基本的に、を使用しても、適切に測定するのに十分な時間ではありませんStopwatch

そして、プログラムの開始後に一度計算を実行した後、時間(特に100ループの場合)が変化し、その後はかなり一定のままである理由を誰かが知っていますか?

私の推測では、それはJITコンパイルやガベージコレクションに関係していると思います。

これが、通常、ベンチマークが最初に「ウォームアップ」ラウンドを実行、テストに適度な時間がかかるように適切な量の作業をテストし、タイミングのわずかなバンプを平滑化する理由です。

于 2012-11-08T23:07:18.493 に答える