Всегда трудно сказать, почему именно определенный фрагмент кода работает так, как он работает без надлежащего профилирования.Особенно когда речь идет о C ++, где нет стандартной реализации, и, следовательно, качество реализации компилятора и библиотеки может значительно различаться в зависимости от того, какой набор инструментов вы используете (примеры: 1 , 2 ).Кроме того, интерфейс, который стандарт требует для unordered_map
, к сожалению, серьезно ограничивает то, что может сделать реализация под ним (см. этот доклад для получения дополнительной информации).Общеизвестно, что std::unordered_map
, к сожалению, не обязательно является лучшей хеш-таблицей, на которую можно надеяться ( немного больше на , что ).
Помимо проблем производительности самого std::unordered_map
, есть несколько незначительных (скорее всего, незначительных) вещей, которые могут поставить ваш код C ++ в дополнительный недостаток.Прежде всего, вы строите строку ключа, а затем копируете ее в карту.Скорее всего, было бы более эффективно переместить строку.Кроме того, std::to_string
потенциально более дорогостоящий, чем преобразование, выполняемое интерполяцией строки Kotlin, потому что std::to_string
вынужден наблюдать текущую локаль, в то время как интерполяция строки Kotlin конвертирует в фиксированный формат.Как правило, здесь довольно расточительно использовать строки в качестве ключей, как уже указывалось в комментариях к вашему вопросу.
Я бы предложил использовать map.try_emplace()
вместо map.emplace_hint()
иstd::to_chars()
вместо std::to_string()
.Кроме того, я не удивлюсь, если Kotlin HashTable является просто более эффективным контейнером, чем std::unordered_map
, возможно, из-за ограничений, установленных его интерфейсом…
Все это, я сказал,Я не уверен, что именно вы пытаетесь достичь с помощью этого теста.В конце концов, здесь вы сравниваете производительность двух случайно выбранных реализаций хеш-таблиц.Вы никогда не сможете выбрать одно из другого, поскольку они существуют в двух совершенно разных экосистемах, поэтому, какими бы ни были результаты этого теста, они не кажутся очень… полезными!?