Unboxing을 방지하는 방법 - 임의의 SQL 행을 읽을 때 권투 메모리 오버 헤드

StackOverflow https://stackoverflow.com/questions/1842838

  •  12-09-2019
  •  | 
  •  

문제

SQL 쿼리에서 행을 나타내는 클래스를 작성하고 있습니다. 클래스의 인덱서 속성을 통해 필드 데이터에 액세스하기를 원합니다. 데이터를 내부 객체 목록에로드하면 충분히 간단합니다. 나는 이미 이것을 시도했고 프리미티브 권투에 만족하지 않습니다. 복싱은 메모리 요구 사항을 20%증가시킵니다. 나는 원시를 수업에서 프리미티브로 저장하고 싶습니다. DataTable Class는 IdataReader에서 반환 된 스키마의 각 열에 대한 배열을 만들어 프리미티브를 저장합니다. 이 방법으로 클래스를 구현했지만 데이터가 행이 내부적으로 참조되는 열이 아닌 행 객체와 함께 저장되는 것을 선호합니다.

이것을 달성하는 것에 대한 아이디어가 있습니까?

도움이 되었습니까?

해결책

행을 나타 내기 위해 구조 유형을 생성 할 수 있습니다. 동적으로 수행 할 수 있으며 권투가 없도록 할 수 있습니다. 그래도 노력이 가치가 있는지 확실하지 않습니다.

다른 팁

오버 헤드 만 20%? 당신은 운이 좋다! 방금 40 배의 성능 감소가 추가 된 코드를 정리했습니다 (추가 메모리의 영향을 계산하지 않음)! 어쨌든, 사용을 방지하는 일반적인 방법 object 제네릭 사용을 시작하는 것입니다. 간단한 예는 다음과 같습니다.

class RowRepresenter<T>
{
    //....
    public T this[int index] {get; set;}  // implementation left out
}

// initialize, suppose the properties (indexers) should be ints:
RowRepresenter<int> myInstance = new RowRepresenter<int>();
myInstance.LoadData();

// get data (i.e., your indexer)
int somefield = myInstance[2];   // no overhead, no casting required
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top