我一直在调查一个有趣的问题。在我的测试中,.NET Dictionary类的性能比STL unordered_map快得惊人,但我搞不清楚为什么。
(在我的机器上,.NET 3.5 SP1和Visual Studio 2008 Express SP1的STL,分别是0.5秒和4秒)
另一方面,如果我在C#和C ++中实现自己的哈希表,则C ++版本大约比C#版本快两倍,这很好,因为它证明了我的常识:本地机器代码有时更快。(请注意,我说“有时候”。)因为我在两种语言中都是同一个人,所以我想知道微软的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;
std::map
是有序的,不像Dictionary<T>
。 - baltermia