실행 파일을 릴리스 모드로 컴파일 할 때 (코드 최적화가 활성화 된 경우) 컴파일러는 성능을 향상시키기 위해 특정 조건을 충족하는 함수를 인라인하도록 선택할 수 있습니다.throw 된 예외에서 인라인 된 함수의 스택 추적이 보존됩니까?
내 질문은 : 인라인 된 함수 본문에 예외가 throw되면 stacktrace 정보가 인라인 확장에 관계없이 유지됩니까? 즉, 원본 함수를 오류의 원인으로 표시하거나 대신 호출 함수를 표시합니까?
실행 파일을 릴리스 모드로 컴파일 할 때 (코드 최적화가 활성화 된 경우) 컴파일러는 성능을 향상시키기 위해 특정 조건을 충족하는 함수를 인라인하도록 선택할 수 있습니다.throw 된 예외에서 인라인 된 함수의 스택 추적이 보존됩니까?
내 질문은 : 인라인 된 함수 본문에 예외가 throw되면 stacktrace 정보가 인라인 확장에 관계없이 유지됩니까? 즉, 원본 함수를 오류의 원인으로 표시하거나 대신 호출 함수를 표시합니까?
예외가 발생하는 방법에 따라 다릅니다. throw 문을 사용하면 문제가 없지만 지터는 throw가 포함 된 인라인 메서드를 사용하지 않습니다. 당신이 속성 세터가 필요할 때를 알아야 할 것.
그러나 NullReferenceException 또는 IndexOutOfRangeException 등의 정상적인 실행으로 인해 예외가 발생하면 인라인 된 경우 스택 추적에 메서드 이름이 표시되지 않습니다. 약간 당황 스러울 지 모르지만 일반적으로 호출하는 메소드의 소스 코드와 예외 유형에서 알 수 있습니다. 바라기를 그것은 상대적으로 작다. [MethodImpl(MethodImplOptions.NoInlining)]
특성을 사용하여 인라인을 억제 할 수 있습니다. 당신이 그것을 발견했을 때 그것은 일반적으로 너무 늦었다;)
이 최종 답변 아니지만 난 .NET 4.5에서 인라인을 (실제로 인라인을 수행)에 JIT 에 대한 힌트를 제공하는 [MethodImpl(MethodImplOptions.AggressiveInlining)]
속성 0으로 만 분할을 수행하는 간단한 방법을 장식하려고 특정 메서드 및 해제 모드에서 프로그램을 실행할 때, 예외가 호출 메서드에서보고 된 아니라 분 할부 함께. 한편, 한스 (Hans)가 말했듯이, throw 문 및 복잡한 흐름 논리가있는 메소드는 인라인되지 않습니다. This Article MSDN 블로그 (2004 년부터)은 JIT에서 인라인하는 방법에 대한 개요를 제공합니다.
감사합니다 스니퍼, 그것을 테스트하는 영리한 방법. 나는 인라인 힌트를 알지 못했다! +1 –
한스, 언제나처럼, 바로 그 자리에 고맙습니다! =) –