Производительность оператора индекса std :: map против метода вставки - PullRequest
2 голосов
/ 15 октября 2019

Я недавно видел изменение в запросе на удаление. Мне интересно, дает ли это какое-либо улучшение.

Ниже приведена упрощенная версия.

...
std::map<int, std::string> myMap;
...  // map will get updated

void foo(int key, std::string value)
{    
    myMap[key] = value;  // <-- this line gets changed
}

Помеченная отдельная строка была изменена следующим образом.

    auto entry = myMap.find(key);
    if (entry == myMap.end())
    {
        myMap.insert(std::make_pair(key, value));
    }
    else
    {
        entry->second = value;
    }

ВозможноНамерение состояло в том, чтобы избежать создания объекта, если key отсутствует (что кажется допустимым). Но не создается ли подобный временный объект в вызове insert()? Или здесь происходит какая-то оптимизация?

На мой взгляд, обе версии должны иметь одинаковую производительность. Но будет улучшение, если вместо insert() будет использоваться emplace().

Может ли кто-нибудь уточнить это, если мое понимание неверно?

1 Ответ

3 голосов
/ 15 октября 2019

Если не измерять, говорить что-либо о потере / выигрыше в производительности - бессмысленно. Конечно, первая версия теоретически быстрее, но только измерение может показать, насколько релевантна теория.

Сказать, что, по моему мнению, смысл изменения состоит в том, чтобы сделать логику явной - присвоить значение или вставить, если значение не существует вкарта. Использование operator[] с std::map является одной из самых неприятных особенностей языка. Начиная с C ++ 17 есть специальный метод для этого - insert_or_assign, который так же быстр, как emplace или insert.

...