편집 :이 가정은 틀린 가정에 근거합니다. 제네릭 형식 인스턴스 조회는 생성 된 제네릭 형식에서 수행 할 때와 동일한 작업입니다. 런타임에. 내 하네스에있는 것들은 컴파일러가 액세스 할 수 있으므로 주소 검색으로 그들을 컴파일 할 수 있습니다. 나는 여전히 메이크 그네 타입이 무대 뒤에서하는 일에 꽤 관심이있다.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;
}
런타임시 makeGenericType (typeof (string)) typeof (Lookup <>)를 사용하면 어떻게 될 수 있습니까? 내가 시도했는데 – mcintyre321
생각 해봐야 할 것 같아요. 런타임에 런타임에 만들 수 있습니다. ,하지만 내 스타일에 반사를 사용하지 않고도 .o에 도달 할 수있는 방법이 없습니다. .o에 액세스하려면 컴파일러에 제네릭 형식을 알려줘야합니다. – mcintyre321