2010-11-25 3 views
3

편집 :이 가정은 틀린 가정에 근거합니다. 제네릭 형식 인스턴스 조회는 생성 된 제네릭 형식에서 수행 할 때와 동일한 작업입니다. 런타임에. 내 하네스에있는 것들은 컴파일러가 액세스 할 수 있으므로 주소 검색으로 그들을 컴파일 할 수 있습니다. 나는 여전히 메이크 그네 타입이 무대 뒤에서하는 일에 꽤 관심이있다.IDictionary의 성능 <유형, 개체> vs 제네릭 형식 속성

방금 ​​IDictionary에서 값을 가져 오는 것과 정적 속성으로 제네릭 형식에서 값을 가져 오는 것 사이를 빠르게 비교했습니다. 100,000,000 조회에 대한

결과 :

사전 : 14.5246952 일반 유형 : 00.2513280

마법의 종류가 너무 빨리 일반의 인스턴스에 매핑 백그라운드에서 사용하여 .NET입니까? 나는 해시 테이블과 비슷한 것을 검색에 사용해야한다고 생각했을 것이다. 어쩌면 문제가 생길지 모르겠다. 너?

여기 내 테스트 장치가 있습니다. 실수가 많아서 고쳐야 할 부분을 알려주세요.

void Main() 
{ 
    var sw = new Stopwatch(); 
    var d = new Dictionary<Type, object>() 
    { 
    { typeof(string), new object() }, 
    { typeof(int), new object() } 

    }; 
    var stringType = typeof(string); 
    var intType = typeof(int); 
    sw.Start(); 
    for (var i = 0; i < 100000000; i++) 
    { 
     Debug.Assert(d[stringType] != d[intType]); 
    } 
    sw.Stop(); 
    sw.Elapsed.Dump(); 
    sw.Reset(); 

    Lookup<string>.o = new object(); 
    Lookup<int>.o = new object(); 
    sw.Start(); 
    for (var i = 0; i < 100000000; i++) 
    { 
     Debug.Assert(Lookup<string>.o != Lookup<int>.o); 
    } 
    sw.Stop(); 
    sw.Elapsed.Dump(); 
} 

class Lookup<T> 
{ 
    public static object o; 
} 

답변

2

귀하의 제네릭에 대한 매핑은 컴파일 타임에 이루어 지지만 사전은 런타임에 조회를 수행합니다.

+0

런타임시 makeGenericType (typeof (string)) typeof (Lookup <>)를 사용하면 어떻게 될 수 있습니까? 내가 시도했는데 – mcintyre321

+0

생각 해봐야 할 것 같아요. 런타임에 런타임에 만들 수 있습니다. ,하지만 내 스타일에 반사를 사용하지 않고도 .o에 도달 할 수있는 방법이 없습니다. .o에 액세스하려면 컴파일러에 제네릭 형식을 알려줘야합니다. – mcintyre321

4

JIT 컴파일러는 정적 변수의 주소를 알고 있습니다. 로더 힙에 할당했습니다. 일반 클래스의 멤버라는 것은 관련이 없습니다. 즉, 정적 변수의 주소를 해석하는 데는 런타임 조회가 필요하지 않으며 컴파일시 수행됩니다. 생성 된 기계어 코드는 간단합니다 :

000000f8 mov   eax,dword ptr ds:[02785D0Ch] 
000000fd cmp   eax,dword ptr ds:[02785D10h] 

하드 코딩 된 주소에 유의하십시오.

관련 문제