두 개의 간단한 응용 프로그램을 작성했습니다 : 1. 익명 메소드를 사용하는 메소드와 2. 간단한 메소드를 사용하는 메소드.테스트에서 왜 익명 메소드가 더 빠릅니까?
위의 간단한 작업을 수행하는 방법 중각 :
int add(int n1, int n2) {return n1+n2}
그리고 나는 add
방법을 10,000 번 호출하는 간단한 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;
}
}
결과 (시대의 액션 버튼 몇 누름) 64에 컴파일은 :
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 밀리 초 이내에 작업을 수행 할 수 있습니다. 반면에 컴퓨터의 시계는 작은 간격으로 측정하기가 힘듭니다. 귀하의 타이밍 코드를 게시하십시오. –
이 질문에 답하기에 충분한 정보가 충분하지 않습니다. 릴리스 또는 디버그 모드에 있습니까? – asawyer
나는 콘솔에 스톱워치를 사용했다. 루프를 실행하는 데 걸린 시간은 릴리스와 디버그에서 '익명 메소드'를 사용하여 fester 였고 일반 메소드였다. – Yanshof