2009-08-27 5 views
6

확실한 예 또는 아니오를 기대하지 않습니다. 당신이 가진 지식은 내가 대답으로 생각할 것입니다.최적화가 활성화되면 JIT는 항상이 방법을 인라인합니까?

private String CalculateCharge(Nullable<Decimal> bill, Nullable<Decimal> rate) 
{ 
    return ((bill ?? 0.0m) * (rate ?? 0.0m)).ToString("C"); 
} 
+0

이것에 "예"라고하기는 어렵지만 사적인 것이므로 그렇게 생각합니다. –

+5

C# 컴파일러는 * anything *을 인라인하지 않습니다. 최적화 목록을 보려면 jit 컴파일러가 아닌 C# 컴파일러가 수행합니다. 주제에 관한 필자의 기사를 참조하십시오. http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx –

+0

감사합니다. Eric, 할 일이 많습니다. – ChaosPandion

답변

21

인라인은 C# 컴파일러가 아니라 JIT의 구현 세부 사항입니다. Eric Gunnerson's blog에서 :

JIT를이 에 휴리스틱의 수는 방법은 안감에- 수 있는지 여부를 결정합니다. 인라인되지 IL 초과의 32 바이트가

  • 방법 : 다음 그 (이 남김이 아니라고 참고)의 더 중요한 목록이다.
  • 가상 함수는 인라인되지 않습니다.
  • 복잡한 흐름 제어가있는 메소드는 줄이 정렬되지 않습니다. 복잡한 흐름 제어는 if/then/else와는 다른 흐름 제어입니다. ; 이 경우 스위치 또는 동안.
  • 예외 처리 블록을 포함하는 메서드는 인라인이 아니지만 예외를 throw하는 메서드는 여전히 인라인의 후보가됩니다.
  • 메서드의 형식 인수가 구조체 인 경우 메서드는 인라인되지 않습니다. 당신의 방법은 그래서는 추론과 일치 할 수 있습니다 매우 복잡한 매우 짧고 아니지만

Nullable<T>struct 그래서 난 당신의 방법은 인라인되지 않은 추측 것입니다.

이 방법을 인라인하면 성능이 향상되므로 JIT는이 방법을 인라인합니다. 그렇지 않으면 그렇지 않습니다. 그들은 JIT의 향후 버전에서 변경 될 수 있으므로

내가 주의 깊게 추론 코딩 명시 적으로 고려할 것입니다 :하지만이 정말 당신이 코드를해야 JIT 아무것도의 구현 세부입니다. 인라인 될 것이라고 보장하려는 메서드의 정확성을 손상시키지 마십시오.

편집 :은 분명히 인라인되지 않는 구조체에 대한 비트가 오래된이다; 업데이트 된 정보는 Vance Morrison's blog에서 찾을 수 있습니다.

+2

struct 옵션은 .NET 3.5sp1에서 더 이상 true가 아닙니다. 구조체 매개 변수는 이제 인라인 될 수 있습니다. –

+0

@ 리피드 코세이지 : 정보 주셔서 감사합니다. 입증 된 포인트 :) – dtb