Хеш-таблица быстрее в C#, чем C++?

Вот любопытство, которое я исследовал. Класс Словаря.NET работает смехотворно быстро по сравнению с STL unordered_map в тесте, которым я продолжаю управлять, и я не могу выяснить почему.

(0,5 секунды по сравнению с 4 секундами на моей машине) (.NET 3,5 SP1 по сравнению с SP1 Экспресса Visual Studio 2008 года 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;
18
задан Brian Tompsett - 汤莱恩 21 October 2016 в 20:01
поделиться

3 ответа

две версии не эквивалентны, вы создаете итератор на каждом проходе вашего цикла while в C ++. это отнимает процессорное время и отбрасывает ваши результаты.

10
ответ дан 30 November 2019 в 09:11
поделиться

Вы измеряете стоимость явного управления памятью. Более подробная статистика доступна здесь. Это тоже актуально. Примечательна попытка Криса Селлса добавить детерминированную финализацию в CLR.

5
ответ дан 30 November 2019 в 09:11
поделиться

На уровне кода будут некоторые отличия: тот факт, что неупорядоченная карта принимает пару, вынуждает создавать такой объект, тогда как C # может быть быстрее с передачей двух параметров в Add.

Еще одним моментом является реализация самих хэш-таблиц: реализация хэш-функции или способ борьбы с коллизиями вызовут разные шаблоны производительности.

Добавьте сюда выравнивание и кэширование, JIT-дружественность некоторых алгоритмов и сравнение две разные реализации на двух разных языках становится очень сложно, и единственное, что вы можете сравнить, - это конкретная задача. Попробуйте использовать меньше или больше элементов или попытайтесь получить доступ к элементам случайным образом, а не последовательно, и вы можете увидеть совсем другие результаты.

2
ответ дан 30 November 2019 в 09:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: