Почему вставка std :: map такая медленная по сравнению с вставкой в ​​словарь c #? - PullRequest
0 голосов
/ 31 мая 2019

Я конвертирую свою библиотеку C # в C ++. Я использую переменную C # Dictionary в приложении, и когда я попытался использовать std::map вместо строки в качестве ключа в обоих сценариях, я почувствовал резкое различие в производительности.

C # Словарь занял 0,022717 секунд с кодом ниже. Карта C ++ занимает около 3 секунд.

C # Словарь:

Stopwatch stopWatch = new Stopwatch();
Dictionary<string, int> dict = new Dictionary<string, int>();
stopWatch.Start();
for (int i = 0; i < 100000; i++)
{
    dict.Add(i.ToString(), i);
}
stopWatch.Stop();
var op = stopWatch.Elapsed.TotalSeconds.ToString();

Карта C ++:

#include <iostream>
#include <map>
#include <string>
#include <chrono>

using namespace std;



int main()
{
    std::map<std::string, int> objMap;

    tm* timetr = new tm();
    time_t t1 = time(NULL);
    localtime_s(timetr, &t1);

    for (size_t i = 0; i < 100000; i++)
    {
        objMap.emplace(std::to_string(i), i);
    }

    tm* timetr2 = new tm();
    time_t t2 = time(NULL);
    localtime_s(timetr2, &t2);

    time_t tt = t2 - t1;
    cout << tt;

    string sss = "";
    cin >> sss;
}

Почему такая разница? Какой должна быть эквивалентная альтернатива для достижения таких же результатов?

1 Ответ

2 голосов
/ 31 мая 2019

Добавьте мои два цента сюда.

C # словарь - это HashMap, а C ++ std :: map - это красно-черные деревья. HashMap работает лучше, чем дерево. Если вы хотите использовать HashMap в c ++, используйте std :: unordered_map.

Не уверен, что 100% это причина, но вы можете узнать это после переключения на std :: unordered_map.

...