Вот любопытство, которое я исследовал. Класс .NET Dictionary работает смехотворно быстро по сравнению с unordered_map STL в тесте, который я продолжаю выполнять, и я не могу понять, почему.
(0,5 секунды против 4 секунд на моей машине) (.NET 3.5 SP1 по сравнению с Visual Studio 2008 Express SP1 STL)
С другой стороны, если я реализую свою собственную хэш-таблицу на C# и C++, версия C++ примерно в два раза быстрее, чем версия C#, и это нормально, потому что это подкрепляет мой здравый смысл в том, что собственный машинный код иногда быстрее. (Видите. Я сказал «иногда».) Поскольку я один и тот же человек, говорящий на обоих языках, мне интересно, какие уловки мог проделать кодировщик C# из Microsoft, чего не смог программист C++ из Microsoft? Мне трудно представить, как компилятор может проделывать такие трюки сам по себе, преодолевая трудности с оптимизацией того, что должно выглядеть как произвольные вызовы функций.
Это простой тест, сохраняющий и извлекающий целые числа.
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;