私は2つの単純なアプリケーションを書いた: 1. 1つは匿名メソッドを使用し、もう1つは 2.簡単なメソッドを使用する。私のテストで匿名メソッドが高速になるのはなぜですか?
上記の各方法は、単純なアクションをやっている:
int add(int n1, int n2) {return n1+n2}
をそして私はadd
メソッド万回を呼び出します簡単なfor
ループを呼び出します。匿名メソッドを使用する実装は、他のメソッドよりもはるかに時間がかかります。どうして?それはJITterが匿名メソッドをインライン化するからですか?
delegate int ADD(int i1, int i2);
private void button1_Click(object sender, EventArgs e)
{
Stopwatch watch = new Stopwatch();
watch.Reset();
watch.Start();
for(int i = 0 ; i < 10000 ; i++)
{
add(i, i);
}
watch.Stop();
Console.WriteLine("Normal Call " + watch.ElapsedTicks);
watch.Reset();
watch.Start();
for(int i = 0 ; i < 10000 ; i++)
{
ADD p = delegate(int n1, int n2)
{
return n1 + n2;
};
p.Invoke(i, i);
}
watch.Stop();
Console.WriteLine(watch.ElapsedTicks);
Console.ReadLine();
}
int add(int n1, int n2)
{
return n1 + n2;
}
}
結果 - リリースモードに - (回のアクションボタンのカップルに押された)のx64でコンパイル:
Normal 1525
1275
Normal 480
477
Normal 371
370
Normal 372
371
Normal 477
479
Normal 477
477
Normal 564
702
Normal 478
476
1000回だけ?現代のコンピュータであれば1ミリ秒未満で実行できます。一方、お使いのコンピュータの時計は、その間隔を小さく測定するのが苦労しています。あなたのタイミングコードを投稿してください。 –
この質問に答えるのに十分な情報はここにはありません。 1つのリリースまたはデバッグモードになっていますか? – asawyer
私はStopwatchをコンソールに使用しました。ループを実行するのにかかる時間は、リリースとデバッグでは '匿名メソッド'を使用していましたが、その後は通常のメソッドでした。 – Yanshof