2010-07-31 2 views
6

.NET JITter는 재귀 적으로 인라인 작은 함수가 다른 작은 함수에서 호출된다는 것을 알고 싶습니다. 의지가 인라인 모든 방법.NET JIT 인라인은 다른 작은 함수를 호출하는 작은 함수입니까?

public static float Square(float value) 
{ 
    return value * value; 
} 

public static float Cube(float value) 
{ 
    return Square(value) * value; 
} 

어디 선가에서 Cube를 호출 할 경우, 또는 나는 Square에 함수 호출로 종료됩니다 :

그냥 예를 들어

?

그렇다면 인라인을 수행하는 데 얼마나 깊은 시간이 걸릴 것입니까? (동일한 방법으로 Quartic 또는 Quintic 함수를 구현할만큼 미쳤다고 가정 해 보겠습니다.)

답변

10

불행히도 나쁜 예를 선택했습니다. x86 JIT 컴파일러는 float를 반환하는 메서드를 인라인하지 않습니다. 왜 100 % 확신 할 수 없는지, 부동 소수점이 FPU의 80 비트 부동 소수점 값으로 변환 될 때 일관되게 문제가 발생하지 않도록하는 것이라고 생각합니다. 내부 정밀도는 80 비트이지만 80 비트 값이 다시 메모리로 플러시 될 때 32 비트 값으로 잘 리면이 추가 비트가 분리됩니다. FPU에 값을 너무 길게 유지하면이 절단이 발생하지 않으며 계산 결과가 변경됩니다. ,

00000000 push  ebp        ; setup stack frame 
00000001 mov   ebp,esp 
00000003 call  6DA2BEF0      ; Console.get_Out() 
00000008 fld   qword ptr ds:[010914B0h]  ; ST0 = 8.0 
0000000e sub   esp,8       ; setup argument for WriteLine 
00000011 fstp  qword ptr [esp] 
00000014 mov   ecx,eax       ; call Console.Out.WriteLine 
00000016 mov   eax,dword ptr [ecx] 
00000018 call  dword ptr [eax+000000D0h] 
0000001e pop   ebp        ; done 
0000001f ret 

뿐만 아니라 그것은 기능을 인라인 않았다

당신은 이중으로 플로트를 교체하고이 코드를 컴파일 할 경우 다음이 기계 코드는 JIT 최적화를 사용할 때 발생하는

static void Main(string[] args) { 
    Console.WriteLine(Cube(2.0)); 
} 

을 컴파일 타임에 표현식을 평가할 수있었습니다. Console.WriteLine (8.0)을 호출하여 결과를 직접 전달합니다. 꽤 좋은가?

float가 아닌 double을 사용하십시오.

+1

흥미 롭습니다 ... XNA에서 일하고 있기 때문에 * 모든 것이 플로트입니다! 약간 ... –

+0

* "x86 JIT 컴파일러는 float을 반환하는 인라인 메서드를 사용하지 않습니다."* - 이것에 대해 확실합니까? 나는 높고 낮은 것을 수색했으며 이것을 뒷받침 할만한 참고 문헌을 찾을 수 없다. 내가 찾은 최고는 Connect : https://connect.microsoft.com/VisualStudio/feedback/details/536781/unexpected-jit-inlining-behavior에서이 페이지가 float * do *를 반환하는 함수임을 암시하는 것처럼 보였습니다. 인라인. 그리고이 (이전) 기사에서는 강압 규칙 (실제로는 다를 수도 있음)이 수레와 두 배에 대해 동일하다는 것을 암시합니다 : http://blogs.msdn.com/b/davidnotario/archive/2005/08/08/449092. aspx –

+1

@Andrew : 인라이닝 규칙은 문서화되지 않았으며 일부 블로그 게시물에서만 암시됩니다. 중요합니다. 문서화 된 동작으로 인한 가정을 위반하지 않으면 서 지터를 향상시키기 위해이를 변경할 수 있어야하기 때문입니다. x86 지터가 보는 것을 문서화 할 수 있습니다. 그리고이 메소드의 부동 버전을 인라인하지 않습니다. 다른 행동을 보입니까? –