powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / CookBook: unordered_map
14 сообщений из 14, страница 1 из 1
CookBook: unordered_map
    #39683407
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

У такой вопрос
Есть у меня unordered_map<string, что-то> um_ в классе.
Объекты этого класса в реал-тайм опрашиваются um_[ключ]
Данных в um_ порядка 3-15, ну 100 максимум.
Самих объектов класса может быть много, 1К-100К, опрос делается по таймеру, цель - избежать лагов.
Пока вопрос только по работе с мапой.

В голову приходят 2 подхода, с т.з. производительности.

1.
Код: plaintext
1.
2.
3.
4.
5.
Smth a = um_[ключ];
if (a)
{
	// Do
}


в этом случае, если в um_ нету ничего соотвествующего "ключу", там заведётся пустой объект, мапа разрастётся, и плюс в коде нужна одна проверка на nullptr;

2.
Код: plaintext
1.
2.
3.
4.
5.
6.
try
{
	Smth a = um_.at(ключ);
	// Do
}
catch(...)


тут проверки нет, мапа не разрастается, но ходят холивары на тему быстродействий при использовании исключений.

Возможно есть ещё варианты?
Как лучше сделать, в рамках задачи?
...
Рейтинг: 0 / 0
CookBook: unordered_map
    #39683413
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Сводится во всех случаях к _Try_emplace, которая работает через find, и там всё равно есть проверка на end(), поэтому можно просто сразу пользоваться find()
...
Рейтинг: 0 / 0
CookBook: unordered_map
    #39683785
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbВсем привет!

У такой вопрос
Есть у меня unordered_map<string, что-то> um_ в классе.
Объекты этого класса в реал-тайм опрашиваются um_[ключ]
Данных в um_ порядка 3-15, ну 100 максимум.
Самих объектов класса может быть много, 1К-100К, опрос делается по таймеру, цель - избежать лагов.
Пока вопрос только по работе с мапой.

В голову приходят 2 подхода, с т.з. производительности.

1.
Код: plaintext
1.
2.
3.
4.
5.
Smth a = um_[ключ];
if (a)
{
	// Do
}


в этом случае, если в um_ нету ничего соотвествующего "ключу", там заведётся пустой объект, мапа разрастётся, и плюс в коде нужна одна проверка на nullptr;

2.
Код: plaintext
1.
2.
3.
4.
5.
6.
try
{
	Smth a = um_.at(ключ);
	// Do
}
catch(...)


тут проверки нет, мапа не разрастается, но ходят холивары на тему быстродействий при использовании исключений.

Возможно есть ещё варианты?
Как лучше сделать, в рамках задачи?


Бредовый вопрос, но вообще-то если тебе нужна скорость, прежде всего надо избавиться от operator[] и использовать методы доступа к значениям в функциональных нотациях. Т.е. фукнции испльзовать. at() find() и так далее.
...
Рейтинг: 0 / 0
CookBook: unordered_map
    #39684218
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivCEMbВсем привет!

У такой вопрос
Есть у меня unordered_map<string, что-то> um_ в классе.
Объекты этого класса в реал-тайм опрашиваются um_[ключ]
Данных в um_ порядка 3-15, ну 100 максимум.
Самих объектов класса может быть много, 1К-100К, опрос делается по таймеру, цель - избежать лагов.
Пока вопрос только по работе с мапой.

В голову приходят 2 подхода, с т.з. производительности.

1.
Код: plaintext
1.
2.
3.
4.
5.
Smth a = um_[ключ];
if (a)
{
	// Do
}


в этом случае, если в um_ нету ничего соотвествующего "ключу", там заведётся пустой объект, мапа разрастётся, и плюс в коде нужна одна проверка на nullptr;

2.
Код: plaintext
1.
2.
3.
4.
5.
6.
try
{
	Smth a = um_.at(ключ);
	// Do
}
catch(...)


тут проверки нет, мапа не разрастается, но ходят холивары на тему быстродействий при использовании исключений.

Возможно есть ещё варианты?
Как лучше сделать, в рамках задачи?


Бредовый вопрос, но вообще-то если тебе нужна скорость, прежде всего надо избавиться от operator[] и использовать методы доступа к значениям в функциональных нотациях. Т.е. фукнции испльзовать. at() find() и так далее.

А чем плохи операторы ?
...
Рейтинг: 0 / 0
CookBook: unordered_map
    #39684335
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semenА чем плохи операторы ?

Семантика у них сложная...

https://en.cppreference.com/w/cpp/container/unordered_map/operator_at
...
Рейтинг: 0 / 0
CookBook: unordered_map
    #39684366
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ключ стрингом не делать
...
Рейтинг: 0 / 0
CookBook: unordered_map
    #39685144
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemarglключ стрингом не делатьключ потом будет hash от string. Делать не стрингом его не удобно, они описываются во конфигаруционных файлах людями, а писать на память эту кучу цифр сложно даже мне.
...
Рейтинг: 0 / 0
CookBook: unordered_map
    #39685145
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbhash от stringхотя, подозреваю, оно уже там так и есть
...
Рейтинг: 0 / 0
CookBook: unordered_map
    #39685192
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,

в плане производительности очень хорошо знать желаемое количество ключей и выделять под них необходимое место заранее - reserve , тогда в идеале не будет перестройки таблицы


по поводу использования в виде кэша, MasterZiv написал


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

ну и ещё такое ИМХО, unordered_map нельзя использовать на дополнение при действиях с контентом который может нести угрозу - например, на сервере при контейнеризации переданных параметров
...
Рейтинг: 0 / 0
CookBook: unordered_map
    #39685212
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,

если их 3-15, то наверное лучше их хранить в обычном векторе(или подобном контэйнере).
потому что в мапе они могут быть раскиданы по куче и поиск будет со скоростью шины. Ну и строки заменить на специальные объекты, которые бы хранили свои данные не на куче, а там, где они расположены.
...
Рейтинг: 0 / 0
CookBook: unordered_map
    #39685821
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)хорошо знать желаемое количество ключейувы, там random.
kealon(Ruslan)тогда в идеале не будет перестройки таблицыа разве unordered_map перестраивается?
kealon(Ruslan)вариант с исключениями вполне живойа почему говорят, что исключения медленно работают? Много раз натыкался на споры на форумах. Или исключения тоже надо уметь готовить правильно?

alex_kесли их 3-15, то наверное лучше их хранить в обычном векторея взял unordered_map из соображений быстрого поиска по ключу. В случае вектора придётся это делать перебором.
alex_kпотому что в мапе они могут быть раскиданы по куче и поиск будет со скоростью шины.я в своё время тестировал поиск по этой мапе, у неё довольно шустрые показатели при огромных размерах.
...
Рейтинг: 0 / 0
CookBook: unordered_map
    #39685943
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbkealon(Ruslan)тогда в идеале не будет перестройки таблицыа разве unordered_map перестраивается?конечно

CEMbkealon(Ruslan)вариант с исключениями вполне живойа почему говорят, что исключения медленно работают? Много раз натыкался на споры на форумах. Или исключения тоже надо уметь готовить правильно?Там всё очень мутно, особенно на x64.

Но для питона ИМХО это чистая арифметика из-за особенностей языка:
вызвать что-то это нужно из того же мапа переменных достать переменную, а потом достать из неё - это 2 операции
а проверить и достать уже выходит 4

т.е. если исходить из особенностей использования кеша, ты гарантировано будешь проигрывать
...
Рейтинг: 0 / 0
CookBook: unordered_map
    #39712674
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А кто-нибудь измерял или так знает?

std::unordered_multimap::equal_range - работает быстрее, чем перебирать?

т.е. мне надо найти элемент по ключу и по ещё одному условию. Я могу использовать std::unordered_multimap::equal_range, потом перебрать по условию. А могу сразу перебрать всю мапу по ключу и по условию.
...
Рейтинг: 0 / 0
CookBook: unordered_map
    #39713442
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,

естествено 1-е (редкие частные случаи во внимание не принимаем)
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / CookBook: unordered_map
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]