我一直在研究好奇心。在我一直运行的测试中,.NET字典类与STL unordered_map相比执行起来非常快,而且我不知道为什么。

(0.5秒,而我的计算机是4秒)
(.NET 3.5 SP1与Visual Studio 2008 Express SP1的STL)

另一方面,如果我用C#和C++实现自己的哈希表,则C++版本的速度大约是C#版本的两倍,这很好,因为它增强了我的常识,即 native 代码有时会更快。 (请参阅。我说“有时”。)我是两种语言的同一个人,我想知道Microsoft的C#编码器能发挥什么技巧而不是Microsoft的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++ while循环的每一遍中都构造了一个迭代器。这会花费CPU时间并抛出结果。

关于c# - C#中的哈希表比C++快吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1897792/

10-10 08:04