2012-02-26 6 views
-1

두 개의 간단한 응용 프로그램을 작성했습니다 : 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 
+5

1000 번만? 현대의 모든 컴퓨터는 1 밀리 초 이내에 작업을 수행 할 수 있습니다. 반면에 컴퓨터의 시계는 작은 간격으로 측정하기가 힘듭니다. 귀하의 타이밍 코드를 게시하십시오. –

+0

이 질문에 답하기에 충분한 정보가 충분하지 않습니다. 릴리스 또는 디버그 모드에 있습니까? – asawyer

+0

나는 콘솔에 스톱워치를 사용했다. 루프를 실행하는 데 걸린 시간은 릴리스와 디버그에서 '익명 메소드'를 사용하여 fester 였고 일반 메소드였다. – Yanshof

답변

2

나는 당신의 결과를 확인 할 수 없었다.

"정상적인"기능은 델리게이트보다 훨씬 뛰어난 성능을 보여줍니다.

class Program { 

    delegate int ADD(int i1, int i2); 

    static int add(int n1, int n2) { 
     return n1 + n2; 
    } 

    static void Main(string[] args) { 

     Stopwatch watch = new Stopwatch(); 

     watch.Start(); 

     const int count = 100000; 

     for (int i = 0; i < count; i++) { 
      add(i, i); 
     } 

     watch.Stop(); 
     Console.WriteLine(watch.ElapsedTicks); 

     ADD p = delegate(int n1, int n2) { 
      return n1 + n2; 
     }; 

     watch.Reset(); 
     watch.Start(); 
     for (int i = 0; i < count; i++) { 
      p.Invoke(i, i); 
     } 

     watch.Stop(); 
     Console.WriteLine(watch.ElapsedTicks); 

    } 

} 

이 인쇄 : 당신은 결과를 비뚤어 일을해야

103 
1321 

여기에 내가 테스트에 사용하여 약간 수정 된 코드입니다.

--- 편집 ---

OK 나는 시험의 또 다른 라운드, 윈폼 응용 프로그램이 시간을 완료했습니다.

  • WinForms 응용 프로그램을 'x86'으로 컴파일하면 결과가 위의 콘솔 응용 프로그램과 동일합니다 (기능이 위임보다 빠릅니다).
  • WinForms가 'x64'로 컴파일되면 함수는 대략 델리게이트 수준까지 속도가 크게 떨어집니다.
  • 기능이 static으로 만들어지면 다시 속도가 올라갑니다 ('x64'WinForms 빌드에서).
  • 위의 콘솔 응용 프로그램은 'x64'빌드에서도 기능이 정적이 아닌 경우에도 느려지지 않습니다.

모든 것이 릴리스 구성에서 디버거 외부에서 측정되었습니다.

+0

나는 그가 결과를 왜곡하지 않는다고 생각한다; 나는 그가 틀린 것을 읽고 있다고 생각하고 최고 라인이 대표자들의 결과이고 방법의 최종선이라고 생각합니다. – Gabe

+0

@Gabe 당신은 그것에 대해 잘 할 수 있습니다;) –

+0

아니요 - 내 코드 수정을 참조하십시오 - 그리고 다시 실행 해보십시오! '보통'코드는 더 느리게 실행됩니다! – Yanshof

관련 문제