문제

Quandry는 - 다음 두 가지 방법 중 가장 잘 수행하는 것은 무엇입니까?
목표 - 유형 래퍼 객체 얻기 (아래 정의)
기준 - 저장 속도
아니요. 기록 - 약 1000- 약 2000, 최대 약 6K
선택 - 즉시 물체를 만들거나 사전에서 조회를 수행합니다.
실행 속도 - 초당 X 시간이라고합니다

NB- 작업 코드를 먼저 전달한 다음 최적화를 위해 이동해야하므로 이론가가 장면 정보 뒤에 엿볼 수 있다면 EOD THU가 실제 성능 테스트를 시작하기 전에 도움이 될 것입니다.

정의 -

class Wrapper  
{  
   public readonly DataRow Row;  
   public Wrapper(DataRow dr)  
   {  
      Row = dr;  
   }  
   public string ID { get { return Row["id"].ToString(); } }  
   public string ID2 { get { return Row["id2"].ToString(); } }  
   public string ID3 { get { return Row["id3"].ToString(); } }  
   public double Dbl1 { get { return (double)Row["dbl1"]; } }  
   // ... total about 12 such fields !  
}  
Dictionary<string,Wrapper> dictWrappers;  

방법 1

Wrapper o = new Wrapper(dr);  
/// some action with o
myMethod( o );

방법 2

Wrapper o;    
if ( ! dictWrappers.TryGetValue( dr["id"].ToString(), out o ) )    
{    
    o = new Wrapper(dr);    
    dictWrapper.Add(o.ID, o);    
}    

/// some action with o    
myMethod( o );    
도움이 되었습니까?

해결책

첫 번째는 실제로 조회를하지 않기 때문에 더 빠를 것입니다. 단순한 할당과 과제를 수행하는 것입니다.

코드의 두 세그먼트는 거의 동일하지 않습니다. 그러나 기능에서는 방법 1이 많은 복제물을 생성 할 수 있기 때문입니다.

다른 팁

  1. 먼저 프로파일 링하지 않고 최적화하지 마십시오.
  2. 코드가 사양/기대치를 충족하지 않으면 프로파일을 절대 프로파일하지 마십시오.
  3. 이 코드를 프로파일 링 해야하는 경우 두 가지 방법을 모두 작성하고 예상 부하로 벤치마킹하십시오.

편집 : 성능이 허용되지 않는 한 다음과 같은 최적화를 선호하려고합니다.

  • 간단
  • 가독성
  • 유지 가능성
  • 테스트 가능성

(최근) 디버그하기가 매우 어려운 고도로 최적화 된 코드를 보았습니다. 나는 그것을 단순화하기 위해 그것을 리팩토링 한 다음 성능 테스트를 실행했습니다. 공연은 용납 할 수 없었기 때문에 프로파일 링을하고 병목 현상을 발견했으며 최적화했습니다. 성능 테스트를 다시 실행했으며 새 코드는 고도로 최적화 된 버전과 비슷했습니다. 그리고 이제 유지하기가 훨씬 쉽습니다.

여기에 무료입니다 프로파일 링 도구.

실제로 테스트하지 않으면 래퍼의 필드 값을 캐싱하는 것 (즉, 모든 토스트 링 및 캐스트를 피하면)은 아마도 성능에 더 많은 영향을 미칠 것입니다.

그런 다음 해당 값을 캐싱하면 래퍼 인스턴스를 자주 재현하기보다는 래퍼의 인스턴스를 유지하고 싶을 것입니다.

당신이 가정합니다 진짜 Per에 대해 걱정하고 (이봐, 발생) 근본적인 래퍼 자체가 개선 될 수 있습니다. 당신은 문자열로 필드 조회를하고 있습니다. 행에 같은 필드를 설정하여 호출을 많이하려면 실제로 조례를 캐시하고 서수를 찾는 것이 더 빠릅니다.

물론 이것은 당신이 실제로 성능에 대해 걱정 해야하는 경우에만, 그리고 이것이 차이를 만드는 인스턴스는 상당히 드 rare니다 (내장 장치에서는 데스크탑에서만큼 드물지는 않습니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top