нужно эти данные отослать в другой тред.
Дело в том, что на входе данные могут быть различного размера, но не более N количества байт. В другом треде я должен записать не более N количества байт из буфера.
Насколько эффективнее создать структуру и отсылать в другой тред структуру типа SomeStruct { buf: [u8; 2000], read_len: N }, нежели использовать вектор ? Или особого смысла не имеет ? Или есть альтернативы ?
Используй вектор и не парься. Создавай через with_capacity. Увидишь проблемы с производительностью - сначала профилируй, потом исправляй обнаруженное, не наоборот.
Я сча просто вот так делаю - let mut buf = [0; 1316]; loop { if let Ok(len) = incoming_connection.read(&mut buf).await { tx.send(buf[..len].to_vec()); } } Думал, может, со структуркой получше было бы.
Почему думаешь что было бы лучше? Это больше кода, больше вероятности совершить ошибку, сложнее рефакторить и в целом читать код.
Я сильно поджат по памяти и цпу-ресурсам. Каждый раз, когда я использую динамическую аллокацию - это боль. Хотя, я не уверен, что в конкретном случае это роляет.
ну если динамические аллокации - плохо, то используй структуру со статическим массивом, да. Твой изначальный вопрос был “насколько это эффективнее?”. Ответ - эффективнее за счет отсутствия аллокаций, но зато на стеке память жрет и передача в другой поток дороже из-за небходимости копировать весь массив вместо пары указателей. Если ты не профилировал и тебе *кажется* что проблема в аллокациях именно этого вектора - то попробуй использовать структуру. Иначе - профилируй, чтобы найти реальную проблему, а не делать догадки
Вектор эффективнее, в кеш линию он и так попадает ничем не хуже массива, зато мувается 24 байта, а не 2000. Кошмарно неэффективно.
Спасибо большое за развернутый ответ. Я так понимаю, лучшее решение - просто создать вектор и копировать его каждый раз при сенде в цикле ?
Обсуждают сегодня