.NET에서는 빈 메서드 호출이 최적화되나요?

빈 메서드 본문이 주어지면 JIT가 호출을 최적화할까요(C# 컴파일러는 그렇지 않다는 것을 알고 있습니다). 어떻게 알아내야 하나요? 어떤 도구를 사용해야 하고 어디를 찾아야 하나요?

이 질문을 받을 거라고 확신하기 때문에, 빈 메서드의 이유는 전처리기 지시문 때문입니다.


Chris: 말이 되긴 하지만 메서드 호출을 최적화할 수 있습니다. 따라서 메서드는 여전히 존재하지만 메서드에 대한 정적 호출은 제거될 수 있습니다(또는 적어도 인라인으로...).

@Jon: 그건 언어 컴파일러가 아무것도 하지 않는다는 뜻이죠. 제가 해야 할 일은 ngen을 통해 dll을 실행하고 어셈블리를 살펴보는 것 같아요.

이 챕터는 JIT 최적화에 대해 꽤 잘 다루고 있습니다. 페이지에서 '메서드가 비어 있습니다'를 검색하면 기사의 절반 정도 아래에 있습니다.

http://www.codeproject.com/KB/dotnet/JITOptimizations.aspx

비어있는 메소드는 사실상 코드가 없는 것을 인라인 처리함으로써 최적화됩니다.

Chris: 메서드가 여전히 바이너리의 일부가 될 것이고 이것이 JIT 최적화라는 것을 알고 있습니다 :-). 이와 약간 관련해서 Scott Hanselman이 릴리스 빌드 호출 스택의 인라이닝에 대해 꽤 흥미로운 글을 썼습니다:

http://www.hanselman.com/blog/ReleaseISNOTDebug64bitOptimizationsAndCMethodInliningInReleaseBuildCallStacks.aspx

해설 (0)

39 는 다음과 같은 코드에서 i& m 추측.

void DoSomethingIfCompFlag() {
#if COMPILER_FLAG
    //your code
#endif
}

그러나 이 won& # 39, 최적화된 아웃해야 수 없다.

partial void DoSomethingIfCompFlag();

#if COMPILER_FLAG
partial void DoSomethingIfCompFlag() {
    //your code
}
#endif

빈 방식은 첫 번째 부분 및 C # 3 컴파일러에서 최적화 아웃해야.

그나저나. 이것은 기본적으로 어떤 부분 방법이 있습니다. Microsoft 추가되든지 코드 생성기, 기본적으로 하는 그들의 Linq 디자이너 호츨 메서드입니다 don& # 39 아무 짓도 하지 않을 수 없다.

이 부분 사용할 수 있는 방법이 아닌 인력용 오버로드할 수 있습니다.

이 방식을 사용하지 않을 경우 성능 최적화 아웃해야 파셜 전혀 받지 않고, 대신 실주했습니다 추가 부담이 추가 빈 메소드 호출이 그것이다.

해설 (1)

아니요, 빈 메서드는 절대로 최적화되지 않습니다. 그 이유는 다음과 같습니다:

  • 메서드가 파생 클래스에서 호출될 수 있습니다. 파생 클래스에서 호출될 수 있습니다. 다른 어셈블리에서
  • 메서드가 를 사용하여 호출할 수 있습니다 ( 로 표시되어 있더라도)

편집 : 예, 그 (훌륭한) 코드 프로젝트 문서를 보면 JITer는 빈 메소드에 대한 호출을 제거합니다. 그러나 메소드 자체는 내가 나열한 이유로 여전히 컴파일되고 바이너리의 일부가 될 것입니다.

해설 (0)

모든 것이 동일하다면, 네, 최적화해야 합니다. JIT는 적절한 경우 함수를 인라인하고 빈 함수보다 더 적절한 것은 거의 없습니다.)

정말 확실하게 하고 싶다면 빈 메서드를 예외를 던지도록 변경하고 예외에 포함된 스택 추적을 출력하세요.

해설 (0)