Eugene-Usachev
@Eugene-Usachev

Какой Object pool стоит использовать в Rust?

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

#[inline(always)]
fn handle_client(mut stream: TcpStream) {
    let mut buffer = [0; 1024];
    while match stream.read(&mut buffer) {
        /* do something*/
    } {};
}

fn main() {
// some code
for stream in listener.incoming() {
    match stream {
        Ok(stream) => {
            thread::spawn(move || {
                handle_client(stream)
            });
        }
        Err(e) => {/* do something*/}
    }
//some code
}


И меня очень смущает постоянно выделять буффер. Хотелось бы использовать некий пул буфферов.
Я долгое время разрабатывал на Go. Go имеет встроенную реализацию Object pool - sync.Pool, но вот Rust такой не имеет (или я плохо искал). Вместо этого я наткнулся на огромное количество реализаций Object pool пользователями github. Какой Object pool вы используете и почему?
  • Вопрос задан
  • 184 просмотра
Решения вопроса 1
vabka
@vabka
Токсичный шарпист
Например https://crates.io/crates/deadpool

Но конкретно в твоём примере не вижу нужды в пуле буферов.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
bingo347
@bingo347
Crazy on performance...
меня очень смущает постоянно выделять буффер

Конкретно в данном примере буффер выделяется на стеке, то есть на его выделение не тратится ровным счетом ничего, так как стек и так уже выделен при запуске потока.
Есть конечно копеечные затраты ресурсов на заполнение буфера нулями. И если в буффер гарантированно сначала идет запись, как в данном случае, то это в принципе можно обойти:
use std::mem::MaybeUninit;
let mut buffer = unsafe {
    #[allow(invalid_value)]
    MaybeUninit::<[_; 1024]>::uninit().assume_init()
};
Но я бы так не делал. Во-первых чистота кода не стоит этих копеек производительности, а во-вторых немного накосячите с чтением и будет UB.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы