現在取り組んでいるプログラムを書いているときに、パフォーマンスの変化に気づき、これを説明するために使用しているいくつかのループの計算時間を確認したいと思いました。
ループ内で単純な加算計算を実行し、それを実行するのにかかった時間を出力する非常に単純なプログラムを作成しましたが、現時点では説明できない影響が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;
}
}
今、私は次のことを観察することができました:
プログラムを開始してボタンをクリックして計算した後、100の短いループは、2回目の実行(2-4)の約2/3回(6-9ティック)かかります。その後、ほぼ同じ長さ(2〜4ティック)のままになります。
ループ時間の間には奇妙な比率があり、ボタンをクリックし続けると次のようになります。
- 100:3
- 1000:15
- 10000:150
- 1000000:17000
- 100000000:840000
計算回数が1/10倍なのに、100ループが1000ループの1/5の時間になる理由と、100Mioがかかる理由はありますか。ループは1Mioの約50倍の長さしかかかりません。計算数が100倍なのにループしますか?そして、プログラムの開始後に一度計算を実行した後、時間(特に100ループの場合)が変化し、その後はかなり一定のままである理由を誰かが知っていますか?