2009-08-14 1 views
1

WPF의 DependencyProperty 및 DependencyObject 시스템과 비슷한 설정이 있습니다. 그러나 내 속성은 일반적입니다. BucketProperty에는 모든 BucketProperties를 추적하는 정적 GlobalIndex (BucketPropertyBase에서 정의 됨)가 있습니다. Bucket은 모든 BucketProperties를 가질 수 있습니다. Bucket은 이러한 BucketProperties의 실제 값을 저장하고 가져옵니다. 이제 내 질문은 이러한 값의 저장을 처리하는 방법과이를 검색 할 때 typecasting을 사용하는 페널티는 무엇입니까? 현재 BucketEntries 배열을 사용하여 속성 값을 간단한 개체로 저장합니다. 이 값을 저장하고 반환하는 더 좋은 방법이 있습니까?일반 값을 저장할 때 C#의 typecasting 및 boxing/unboxing 유형의 성능 저하가

은 아래에 simpliefied 버전 :

public class BucketProperty<T> : BucketPropertyBase 
{ 

} 

public class Bucket 
{ 
    private BucketEntry[] _bucketEntries; 

    public void SaveValue<T>(BucketProperty<T> property, T value) 
    { 
     SaveBucketEntry(property.GlobalIndex, value) 
    } 
    public T GetValue<T>(BucketProperty<T> property) 
    { 
     return (T)FindBucketEntry(property.GlobalIndex).Value; 
    } 
} 

public class BucketEntry 
{ 
    private object _value; 
    private uint _index; 
     public BucketEntry(uint globalIndex, object value) 
     { 
      ... 
     } 
} 

답변

0

내가 록 포드 Lhotka의 book on Business Objects을 통해 읽은 후 매우 비슷한 설정을 만들었습니다하지만 난 입력 된 백업을 유지하기 위해 속성의 구현을 강제로 객체 권투 문제를 피할 수 필드 대신. 나는 이것이 무역이라는 것을 알고 있지만 제 경우에는 새로운 속성을 선언하는 단순성보다 성과를 중시했습니다. 속성 조회 및 관리 전반에서 형식을 관리하기 위해 람다 식과 제네릭을 매우 심하게 사용하고 있으며 현재까지는 종속성 개체 및 CSLA의 성능을 능가하고 있습니다.

귀하의 질문에 대답하려면 네, 당신은 개체 권투를 사용하여 성능에 치명타가 될 것입니다 그리고 당신이 저장할 것입니다 이러한 속성에 의해 뒷받침되는 값 유형에 대한 힙에 여분의 포인터를 유지 일반적으로 메모리를 두 번 것입니다 각 값 이러한 값의 풋 프린트. 성능에 얼마나 많은 영향을 주는지에 관해서는 다른 요소들 사이에서 이러한 속성을 정기적으로 읽고 쓰는 방법에 따라 다릅니다. 성능 차이에 대한 느낌을 얻으려면 루프를 실행하고 일부 정수를 객체로 상자에 넣고 일반 필드에 동일한 값을 저장하는 것과 달리 상자에 넣지 않는 작은 테스트 응용 프로그램을 만드는 것이 좋습니다. 내 짐작은 개체 복싱 및 un-boxing을하지 않음으로써 적어도 2 배 이상의 성과를 올릴 수 있지만 내 말을 받아들이지 않는 것입니다.