2009-11-16 3 views
1

이 질문에 성능과 관련하여 주요 관심사로 질문하고 있습니다. 그러나 나는 두 가지 접근법에 대한 다른 가능한 장단점을 알고 싶다.속성 변수를 직접 액세스하여 멤버 변수에 액세스

질문은 다음과 같습니다. 속성이 일리노이의 메서드로 변환 되었기 때문에 필드를 클래스에 직접 액세스하는 대신 속성을 호출하면 성능이 크게 저하 될 수 있습니까?

전적으로 IDataReader에서 "도메인 엔터티를 구성하는"변환 클래스 (PersonalizationConstructor)를 설계하고 있습니다.

나는이 클래스 (PersonalizationConstructor)의 생성자에서 IDataReader를 받아들이고 IDataReader 레코드 집합에서 데이터를 반환하도록 가상 속성을 보호하려고합니다. like :

protected virtual string ProductFilterCriteria 
{ 
    get; 
    set; 
} 

이 구현을 위해 하나의 클래스에 15 개 이상의 속성이있을 수 있습니다. 이렇게하면 레코드 집합에서 액세스하기 전에 레코드 집합에 "XXX"필드가 있는지 확인하기 위해 속성을 재정의 할 수 있습니다 (모든 개체에 대한 기본 구현을 원하지 않습니다).

위의 경우를 구현하기 위해 클래스에 15 개 이상의 가상 속성을 갖는 것이 좋습니까?


IDataReader에 집중하지 마십시오. 내 주요 관심사입니다 : 속성 IL의 방법으로 변환됩니다

때문에, 성능 처벌 중요한있을 수 속성 대신 (클래스 내에서) 직접 필드 접근이라고하면?

에게 는 나는이 같은 낳게 될 것이다

:

class MainSite 
{ 
    protected virtual string ProductFilterCriteria 
    { 
     get 
     {   
      return _source["ProductFilterCriteria"]; 
     } 
    } 

    protected virtual string Abc 
    { 
     get 
     { 
      return _source["Abc"]; 
     } 
    } 

    protected virtual string Def 
    { 
     get 
     { 
      return _source["Def"]; 
     } 
    } 

    ..... many properties 
} 

class VirtualSite : MainSite 
{ 
    protected override string ProductFilterCriteria 
    { 
     get 
     { 
      return null; 
     } 
    } 
} 

답변

1

설정을 또는 C# 3.0 속성 구문, 또는 필드 백업 이전 스타일로 구현이야 속성을 검색, (그러나 반드시 것) 될 수 있습니다 JIT에 의해 최적화되었습니다. 즉,이 점에서 최적화는 측정 할 수 없거나 비생산적 일 수 있습니다.

int과 같은 기본 유형과 반대로 클래스 유형을 사용하는 속성에 대해 이야기하고 있습니다 (float). 이러한 클래스의 오버 헤드 (ctor) 또는 완전히 다른 작업을 수행하는 데 소요되는 시간 (값 비싼 데이터를 읽는 것으로 가정하는 IDataReader)은 변경 가능한 1 ~ 2 μ-ops보다 훨씬 큽니다. 속성을 필드에 추가합니다. 내가 얻는 것 : 그것은 0.001 %의 이익과 같습니다.

다른 말로하면 : 내부 루프에 있고 매 마이크로 초를 압축해야하는 매우 드문 경우이지만이 선택 사항을 다시 고려해 볼 수 있습니다. 다른 모든 상황에서는 gettors/settors를 사용하십시오.

추 신 :이 q에 대한 다른 대답을 읽으십시오. 내가 아마 오해했다고 생각하게 만듭니다. 그렇다면 코멘트를 남겨주세요.

편집 : Jon S.은 가상 속성이 최적화되지 않았 음을 언급합니다.그러나 작은 이익에 스토리 라인은 당신이 걱정하는 DataReader를의 부분을 설명하는 "기본 유형이"때문에 관계없이

+0

이 경우는 가상 속성이므로 속성을 봉인하는 유형으로 알려져있는 경우를 제외하고는 최적화 할 수 없습니다. –

+0

@ 존 : 감사합니다, 당신은 절대적으로 옳습니다. 그러나 그때조차도, 부동산에서 현장으로 옮겨가는 것에서의 성과 이득은 거의 모든 시나리오에서 무시할 수 있습니다. – Abel

1

당신은 아마, IDataReader보다는 IDataRecord을 수용 할 남아있다.

그렇지 않으면 속성 만 사용합니다. 괜찮을 것이다. 나는 그들을 "가상"이라고 표시하지 않을 것이다. 확률은이 유형이 실제로 상속되도록 의도되지 않은 것이며 이러한 속성 일 경우에는 다루어서는 안됩니다.

2

성능을 기준으로 설계를 결정하기 전에 - 측정하십시오!

데이터가 관계형 데이터베이스에서 왔다고 가정하면 I 은 쿼리 자체 (및 관련 변환, 네트워크 IO 등)가 성능을 압도한다고 의심합니다.

JIT는 가상의 속성 호출을 인라인 할 수 없지만 가상 속성을 사용하는 이유는 구현마다 다른 작업이 필요할 수 있기 때문에 실제로 사용할 수있는 옵션이 없다는 것입니다. 어쨌든 직접 필드 액세스.

귀하의 디자인이 좋은지 아닌지 - 우리는 실제로 충분한 정보가 없습니다 -하지만 당신이 필요로하는 것을 구현하는 가장 가독성있는 방법이라고 생각한다면, 프로토 타입을 만들고 그 그 디자인에서 벗어나기 전에 성능.

관련 문제