여기 제가 조사해 본 호기심이 있습니다. .NET Dictionary 클래스는 계속 실행중인 테스트에서 STL unordered_map과 비교하여 엄청나게 빠르며 그 이유를 알 수 없습니다.C#에서 해시 테이블이 C++보다 빠릅니까?
(0.5 초 대 내 컴퓨터 4 초) 나는 C# 및 C에 내 자신의 해시 테이블을 구현하는 경우, 다른 한편으로
(비주얼 스튜디오 2008 익스프레스 SP1의 STL 대 .NET 3.5 SP1), ++ , C++ 버전은 C# 1의 두 배 정도 빠르며, 이는 네이티브 컴퓨터 코드가 가끔 더 빠른 상식을 강화하기 때문에 정상입니다. ("때때로"라고 말했죠.) 두 언어로 같은 사람이되어서, 마이크로 소프트의 C# 코더가 마이크로 소프트의 C++ 코더가 놀 수있는 트릭이 뭔지 궁금합니다. 필자는 컴파일러가 이러한 트릭을 독자적으로 수행 할 수있는 방법을 상상할 수 없으며, 임의의 함수 호출로 간주해야하는 것을 최적화하는 문제를 겪고 있습니다.
정수를 저장하고 검색하는 간단한 테스트입니다.
C 번호 :
const int total = (1 << 20);
int sum = 0;
Dictionary<int, int> dict = new Dictionary<int, int>();
for(int i = 0; i < total; i++)
{
dict.Add(i, i * 7);
}
for(int j = 0; j < (1 << 3); j++)
{
int i = total;
while(i > 0)
{
i--;
sum += dict[i];
}
}
Console.WriteLine(sum);
C++ :
const int total = (1 << 20);
int sum = 0;
std::tr1::unordered_map<int, int> dict;
for(int i = 0; i < total; i++)
{
dict.insert(pair<int, int>(i, i * 7));
}
for(int j = 0; j < (1 << 3); j++)
{
int i = total;
while(i > 0)
{
i--;
std::tr1::unordered_map<int, int>::const_iterator found =
dict.find(i);
sum += found->second;
}
}
cout << sum << endl;
사전과 같이 입력 된 C++ 버전은입니까? –
네이티브 컴퓨터 코드가 무엇보다 빠릅니까? C#이 어떻게 돌아가고 있다고 생각하니? –
성능을 어떻게 측정합니까? – stefanB