2009-03-11 5 views
38

나는 XNA에서 주변을 파고 들었고 그 안에 Vector3 클래스가 속성 대신 공개 필드를 사용하고있는 것을 보았습니다. 빠른 벤치 마크를 시도한 결과, struct에 대한 차이가 상당히 뚜렷하다는 것을 알았습니다 (두 개의 벡터를 합치면 1 억 번은 속성으로 2.0 초, 필드가 1.4 초). 참조 유형의 경우 그 차이는 그다지 크지는 않지만 거기에 있습니다.공개 필드가 속성보다 왜 더 빠릅니까?

왜 그렇습니까? 속성이 get_Xset_X 메서드로 컴파일되어 메서드 호출 오버 헤드가 발생할 수 있습니다. 그러나,이 간단한 getters/setter 항상 JIT에 의해 줄 지어하지 않아? 나는 당신이 JIT가 무엇을하기로 결심하는지 보증 할 수 없다는 것을 알고 있습니다. 그러나 확실하게 이것은 확률 목록에서 상당히 높습니다. 공용 필드를 기계 수준의 속성과 구분하는 또 다른 요소가 있습니까?

내가 궁금해했던 한 가지 : 공개 필드보다 자동 구현 된 속성 (public int Foo { get; set; })이 '더 나은'OO 디자인은 무엇입니까? 또는 더 나은 말했다 : 어떻게 그 두 다른? 나는 그것이 재산으로 만드는 것이 반성과 함께 더 쉽다는 것을 압니다. 나는 두 가지 질문에 대한 답이 똑같을 것이라고 확신한다.

BTW : .NET 3.5 SP1을 사용하고 있는데 구조체가있는 메서드 (또는 메서드 구조체가 확실하지 않습니다.)가 고정 된 문제를 안고 있다고 생각합니다. 내가 적어도 DX10.1을 가지고 있지 않은 점을 제외하면 DX10.1을 가지고 있어야하는 SP1과 함께 Vista 64 비트를 사용하고 있습니다.

기타 : 그래, 내가 봤네 릴리스 빌드 :

편집 : 나는 빠른 답변들 감사,하지만 난이 속성 액세스 메서드 호출임을 알고 것으로 나타났다, 그러나 나는 '돈 것을 아마도, 줄 지어있는 방법이 직접 필드 액세스보다 느린 이유를 알 수 없습니다.

편집 2 : 그래서 내가 만들어 내가 그것을에서 라이닝 해제 여부 같은 명시 적 GetX을() (나는 모든에서 내 자바 일을 를 놓치지 않는 방법 O) 방법을 사용하고 수행 다른 struct ([MethodImplAttribute(MethodImplOptions.NoInlining)] 통해) 그렇지 않으므로 결론 : 정적이 아닌 메서드는 구조체에없는 경우에도 명백히 인라인되지 않습니다.

JIT가 가상 메서드 호출을 최적화 할 수있는 예외가 있다고 생각했습니다. 왜 상속을 알지 못하는 구조체에서 이런 일이 발생하지 않을 수 있으며 따라서 메서드 호출은 가능한 한 가지 방법만을 가리킬 수 있습니다. 맞습니까? 아니면 인터페이스를 구현할 수 있기 때문입니까?

은 정말 더러운 기분이 나 성능에 중요한 재료의 속성을 사용하여, 아직 필드를 사용하는 방법에 대해 생각하게하고 나뿐만 아니라 내가

C.에서 뭘하는지 작성할 수 있기 때문에 이것은, 수치의 종류

EDIT 3 : 정확한 주제와 관련하여 this 게시 됨. 그의 최종 결론은 부동산 호출이 최적화되지 않았다는 것입니다. 나는 또한 일리노이에서 callvirt 임에도 불구하고 간단한 getter/setter 속성이 줄 지어있을 것이라는 것을 충분히 읽은 것으로 맹세했습니다. 그래서 나는 미쳐 가고 있니?

EDIT 4 :

재 : 리드 Copsey 아래 댓글에 답을 게시 EDIT3이 - 내 업데이트 된 의견을 참조 :이의 x64 JIT 문제 대 86 JIT 믿습니다. x64의 JIT는 성숙하지 않습니다. 나는 더 많은 64 비트 시스템이 매일 온라인으로 올라옴에 따라 MS가이를 빨리 향상시킬 것으로 기대한다. - 리드 Copsey

그리고 그의 대답에 내 대답 :

덕분에,이 답이다! x86 빌드를 강제 실행하려고 시도했지만 모든 방법이 똑같이 빠르며 x64보다 훨씬 빠릅니다. 이것은 실제로 저에게 아주 충격적입니다. 저는 제 64 비트 OS에서 석기 시대에 살고 있다는 생각을하지 못했습니다. 제 대답에 귀하의 의견을 포함 시켜서 더 잘 나타납니다. - JulianR

감사합니다.

+0

질문 : 입력란이 공개이지만 속성이 있으면 어떻게됩니까? 그 때 그것은 인라인됩니까? – Quibblesome

+0

그 것처럼 보이지 않습니다. – JulianR

+1

Re : Edit3 - 내 업데이트 된 코멘트보기 : x86 JIT 대 x64 JIT 문제라고 생각합니다. x64의 JIT는 성숙하지 않습니다. 나는 더 많은 64 비트 시스템이 매일 온라인으로 올라옴에 따라 MS가이를 빨리 향상시킬 것으로 기대한다. –

답변

관련 문제