насколько критично по производительности?
вариант с поиском в сортированном векторе/массиве не пробовал?
добавление простого хэша как ситуацию изменит?
В моем случае производительность всегда критична. Во всяком случае желательна.
Иначе получается Electron.
NB>вариант с поиском в сортированном векторе/массиве не пробовал?
Сортированный вектор из 8 элементов? Зачем?
NB>добавление простого хэша как ситуацию изменит?
А как это меняет дело?
Я в скрипте как-то проводил исследование — представление object в памяти:
{ foo: 1,
bar: 2,
zed: 3 }
Оказалось что если кол-во key/value пар меньше 7-8 то линейный поиск быстрее — меньше накладных расходов на подготовку поиска.
Поэтому если элементов больше 8 я object конвертирую в hash table.
Но это все индивидуально — зависит от того что есть ключ в конкретном случае.
Здравствуйте, night beast, Вы писали:
NB>насколько критично по производительности? NB>вариант с поиском в сортированном векторе/массиве не пробовал? NB>добавление простого хэша как ситуацию изменит?
Нет, там немного другой расклад — гораздо критичнее совсем другие параметры.
У варианта с map используется чуть менее медленное сравнение (отношение, а не равенство) чем в варианте с if, но при этом само количество сравнение меньше (причём принципиально — O(n) vs O(log(n)) ). Соответственно чем больше элементов в нашем списке вариантов, тем больше будет преимущество кода с map над вариантом с if.
Ну и ещё отдельно можно отметить, что нахождение среди тестируемых образцов вариантов не входящих в список определённых существенно деградирует эффективность кода с if (т.к. надо всегда проходить весь путь сравнения) и почти никак не влияет на производительность кода с map.
Здравствуйте, alex_public, Вы писали:
_>Здравствуйте, c-smile, Вы писали:
CS>>А если не гадать на кофейной гуще то вот результаты теста — меньше run time — лучше: CS>>
CS>>Т.е. мой вариант не то что не хуже, а вообще в два раза быстрее.
_>К сожалению не могу проверить данные результаты, т.к. не знаю кто такие tool::chars и т.п.
Ты как я понял используешь map string_view.
Т.е. можешь переписать мой вариант со string_view — получишь тот же результат — map медленнее.
Это если string_view::operator=() правильно написан конечно.
Здравствуйте, alex_public, Вы писали:
_>Здравствуйте, night beast, Вы писали:
Это вот ты написал?
_>то очевидно что std::map будет эффективнее, т.к. инициализация дерева будет происходить только один раз. И это кстати не теория — я использую на практике именно такой подход (только со string_view, а не string в качестве ключа для map).
Если "да" то вот тебе пример когда map медленнее перебора.
Здравствуйте, c-smile, Вы писали:
_>>К сожалению не могу проверить данные результаты, т.к. не знаю кто такие tool::chars и т.п. CS>tool::chars это пара CS>
А, ну т.е. это как раз самопальный аналог string_view. )))
_>>Вообще то это не моя функция — её предложил uzhas. Я вроде как вполне однозначно написал выше, что использую немного другой вариант. CS>Ты как я понял используешь map string_view. CS>Т.е. можешь переписать мой вариант со string_view — получишь тот же результат — map медленнее. CS>Это если string_view::operator=() правильно написан конечно.
Эм, оператор равенства? ) У тебя какое-то весьма странное представление об алгоритмах... Как ты себе представляешь бинарное дерево на основе оператора равенства? )))
В реальном мире std::map очевидно использует оператор сравнения (а конкретно оператор "меньше"), а не оператор равенства. Причём если не указать иного, то используется стандартный оператор "меньше" для указанного в качестве ключа типа. И как раз в этом и заключается причина медленности твоей реализации варианта с map: стандартный оператор сравнения у std::string (да и у std::string_view тоже) является лексикографическим, что абсолютно логично для строкового типа, но совершенно избыточно для ключа бинарного дерева. Однако стоит нам указать более подходящий оператор сравнения, например так:
как сразу же данный код с map становится быстрее твоего варианта с if'ми даже для указанного в твоём примере небольшого перечисления (для больших перечислений map будет эффективнее даже со стандартным лексикографическим оператором сравнения).
Здравствуйте, c-smile, Вы писали:
CS>Это вот ты написал? _>>то очевидно что std::map будет эффективнее, т.к. инициализация дерева будет происходить только один раз. И это кстати не теория — я использую на практике именно такой подход (только со string_view, а не string в качестве ключа для map).
Зачем задавать риторические вопросы? )
CS>Если "да" то вот тебе пример когда map медленнее перебора.
Пока что подобного примера не видел. А видел только неумение пользоваться стандартными средствами языка и как следствие этого написание самопальных велосипедов. )
Здравствуйте, c-smile, Вы писали:
CS>Ты думаешь что условно 9 if: CS>if(s.length = A && strcmp(...) == 0) t = 1; CS>[/ccode] CS>будет медленнее чем создание std::map и поиск по дереву?
Конечно if зарулит, если еще построить автомат, чтобы без strcmp, думаю, будет еще быстрее. А уж если собрать статистику, что чаще ищется и использовать чтобы минимизировать branch mispredict, то еще лучше. map здесь делает код чище, поэтому если овчинка выделки не стоит я за map (unordered_map), а в плане быстродействия вообще сравнивать смысла нет.
Здравствуйте, MTD, Вы писали:
MTD>Конечно if зарулит, если еще построить автомат, чтобы без strcmp, думаю, будет еще быстрее. А уж если собрать статистику, что чаще ищется и использовать чтобы минимизировать branch mispredict, то еще лучше. map здесь делает код чище, поэтому если овчинка выделки не стоит я за map (unordered_map), а в плане быстродействия вообще сравнивать смысла нет.
В данном конкретном случае unordered_map будет менее эффективным решением, по сравнению с просто map. )