불행히도 나쁜 예를 선택했습니다. 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을 사용하십시오.
흥미 롭습니다 ... XNA에서 일하고 있기 때문에 * 모든 것이 플로트입니다! 약간 ... –
* "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 –
@Andrew : 인라이닝 규칙은 문서화되지 않았으며 일부 블로그 게시물에서만 암시됩니다. 중요합니다. 문서화 된 동작으로 인한 가정을 위반하지 않으면 서 지터를 향상시키기 위해이를 변경할 수 있어야하기 때문입니다. x86 지터가 보는 것을 문서화 할 수 있습니다. 그리고이 메소드의 부동 버전을 인라인하지 않습니다. 다른 행동을 보입니까? –