Ребят, есть вопрос. Есть такая задача. На вход приходят данные,

нужно эти данные отослать в другой тред.
Дело в том, что на входе данные могут быть различного размера, но не более N количества байт. В другом треде я должен записать не более N количества байт из буфера.
Насколько эффективнее создать структуру и отсылать в другой тред структуру типа SomeStruct { buf: [u8; 2000], read_len: N }, нежели использовать вектор ? Или особого смысла не имеет ? Или есть альтернативы ?

7 ответов

4 просмотра

Используй вектор и не парься. Создавай через with_capacity. Увидишь проблемы с производительностью - сначала профилируй, потом исправляй обнаруженное, не наоборот.

Lighty- Автор вопроса
Ilya Bogdanov 🇺🇦
Используй вектор и не парься. Создавай через with_...

Я сча просто вот так делаю - let mut buf = [0; 1316]; loop { if let Ok(len) = incoming_connection.read(&mut buf).await { tx.send(buf[..len].to_vec()); } } Думал, может, со структуркой получше было бы.

Lighty
Я сча просто вот так делаю - let mut buf = [...

Почему думаешь что было бы лучше? Это больше кода, больше вероятности совершить ошибку, сложнее рефакторить и в целом читать код.

Lighty- Автор вопроса

Я сильно поджат по памяти и цпу-ресурсам. Каждый раз, когда я использую динамическую аллокацию - это боль. Хотя, я не уверен, что в конкретном случае это роляет.

Lighty
Я сильно поджат по памяти и цпу-ресурсам. Каждый р...

ну если динамические аллокации - плохо, то используй структуру со статическим массивом, да. Твой изначальный вопрос был “насколько это эффективнее?”. Ответ - эффективнее за счет отсутствия аллокаций, но зато на стеке память жрет и передача в другой поток дороже из-за небходимости копировать весь массив вместо пары указателей. Если ты не профилировал и тебе *кажется* что проблема в аллокациях именно этого вектора - то попробуй использовать структуру. Иначе - профилируй, чтобы найти реальную проблему, а не делать догадки

Вектор эффективнее, в кеш линию он и так попадает ничем не хуже массива, зато мувается 24 байта, а не 2000. Кошмарно неэффективно.

Lighty- Автор вопроса
Traveller Kolsky
Вектор эффективнее, в кеш линию он и так попадает ...

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

Похожие вопросы

Обсуждают сегодня

а что делать если тебя убивают на картах?
Yarik yarik kyda ti lezesh
43
Мне вот что интересно, кто на рфе стартовал/играл, что вы фармили, в каком виде контента он прямо хорош? Экспедиция? Вроде прямо на замазанных мапах рф сдувается
Владислав
20
Подскажите где можно прочитать про реализацию возможности писать человеку при подписке на телеграм канал от имени бота? Было бы не плохо если для Telegraf@3.38.0
Pan Lipton
10
‌/r/pathofexile moderation changes top scoring links : pathofexile (RSS) Hi, everyone. On behalf of the subreddit mod team, I’m here to give you a few updates on the subreddi...
Esionru
3
У меня вопрос к знающими, стоит ли вступать в гильдии в игре или лучше полная свобода?
Енот Полоскун
17
У вас бывает ощущение, что хочется потратить весь отпуск на то, чтоб только спать?
Николай
15
Как можно настроить фильтр в пое под себя?
Yarik yarik kyda ti lezesh
15
Кто нибудь поясните это всё таки вброс или да? Про санктум слышал на поедб вбросили, а по дурке откуда инфа и на сколько это вообще правда? Пахнет шизофренией какой-то ✅Divi...
Dmitry Ritter
9
Ребят, есть какие нибудь мили билды, способные в шмотках с пола закрывать атлас?
Ninja Obormot
12
Всем привет, может уже кто-то пытался выдернуть из api информацию о дате рождения пользователя Есть ли вообще такая возможность?
Artem Stormageddon
2
Карта сайта