빈 메서드 본문이 주어지면 JIT가 호출을 최적화할까요(C# 컴파일러는 그렇지 않다는 것을 알고 있습니다). 어떻게 알아내야 하나요? 어떤 도구를 사용해야 하고 어디를 찾아야 하나요?
이 질문을 받을 거라고 확신하기 때문에, 빈 메서드의 이유는 전처리기 지시문 때문입니다.
Chris: 말이 되긴 하지만 메서드 호출을 최적화할 수 있습니다. 따라서 메서드는 여전히 존재하지만 메서드에 대한 정적 호출은 제거될 수 있습니다(또는 적어도 인라인으로...).
@Jon: 그건 언어 컴파일러가 아무것도 하지 않는다는 뜻이죠. 제가 해야 할 일은 ngen을 통해 dll을 실행하고 어셈블리를 살펴보는 것 같아요.
이 챕터는 JIT 최적화에 대해 꽤 잘 다루고 있습니다. 페이지에서 '메서드가 비어 있습니다'를 검색하면 기사의 절반 정도 아래에 있습니다.
http://www.codeproject.com/KB/dotnet/JITOptimizations.aspx
비어있는 메소드는 사실상 코드가 없는 것을 인라인 처리함으로써 최적화됩니다.
Chris: 메서드가 여전히 바이너리의 일부가 될 것이고 이것이 JIT 최적화라는 것을 알고 있습니다 :-). 이와 약간 관련해서 Scott Hanselman이 릴리스 빌드 호출 스택의 인라이닝에 대해 꽤 흥미로운 글을 썼습니다:
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 아무 짓도 하지 않을 수 없다.
이 부분 사용할 수 있는 방법이 아닌 인력용 오버로드할 수 있습니다.
이 방식을 사용하지 않을 경우 성능 최적화 아웃해야 파셜 전혀 받지 않고, 대신 실주했습니다 추가 부담이 추가 빈 메소드 호출이 그것이다.
아니요, 빈 메서드는 절대로 최적화되지 않습니다. 그 이유는 다음과 같습니다:
편집 : 예, 그 (훌륭한) 코드 프로젝트 문서를 보면 JITer는 빈 메소드에 대한 호출을 제거합니다. 그러나 메소드 자체는 내가 나열한 이유로 여전히 컴파일되고 바이너리의 일부가 될 것입니다.