Здравствуйте, Engler, Вы писали:
E>Здравствуйте, c-smile, Вы писали:
E>Если честно, я бы присмотрелся к Вашему тесту более внимательно.
Посмотрел немного более внимательно.
Мне все-таки кажется, что сравнение в тесте не совсем корректное.
Функция,
FormatterType if_t2e(std::string name)
Сам код в этой функции дает определенные подсказки компилятору.
Судя по всему очень хорошо инлайнится, + возможно еще есть магия опцимизации ( я там не во всем разбирался ).
И это, не совсем честный линейный поиск. Вместо этого, по хорошему надо делать поиск в std::vector.
Тогда получится, что вы сравниваете похожие вещи.
| | Код |
| | std::vector<std::pair<std::string, FormatterType>> vector_map = {
std::pair<std::string,FormatterType> { "text", simple_formatter },
std::pair<std::string,FormatterType> { "integer", integer_formatter },
std::pair<std::string,FormatterType> { "decimal", decimal_formatter },
std::pair<std::string,FormatterType> { "currency", currency_formatter },
#if ENTRIES > 4
std::pair<std::string,FormatterType> { "date", date_formatter },
#if ENTRIES > 5
std::pair<std::string,FormatterType> { "date-local", date_local_formatter },
#if ENTRIES > 6
std::pair<std::string,FormatterType> { "time", time_formatter },
#if ENTRIES > 7
std::pair<std::string,FormatterType> { "time-local", time_local_formatter },
#if ENTRIES > 8
std::pair<std::string,FormatterType> { "enum", enum_formatter },
#if ENTRIES > 9
std::pair<std::string,FormatterType> { "duration", duration_formatter }
#endif
#endif
#endif
#endif
#endif
#endif
};
FormatterType vector_search(const std::string& name)
{
auto it = std::find_if(vector_map.begin(), vector_map.end(),
[&name](const std::pair<std::string, FormatterType>& p) { return name == p.first; });
return (it != vector_map.end()) ? it->second : simple_formatter;
}
// это в main
run_test(vector_search, "vector_search");
|
| | |
Вот что у меня получилось,
| | Результаты |
| | map_t2e 6.85883 359490000
unordered_map_chars_t2e 4.56228 359490000
unordered_map_string_index 5.755 359490000
if_t2e 2.12067 359490000
gperf_t2e 2.27001 359490000
vector_search 6.77989 359490000
|
| | |
А вот кстати, поведение std::unordered_map::find меня удивило.
Она вызывает lower_bound, которая в свою очередь уже
1) строит хеш [вызывается кастомный функтор], что в общем-то естесвенно
2) вызывает опреатор == ( для поиска элеметна в листе , на который указывает bucket )
3) вызывает опреатор == еще раз ( пока не понял зачем ).
В итоге мы имеем хорошо оптимизированную функцию if_t2e,
против непонятно какой реализации unordered_map.
P.S: VS VS2015