Избегайте клонирования струнных полей в ржавчине - PullRequest
1 голос
/ 03 мая 2020

У меня MyObjManager, который содержит массив MyObj (более 1500 элементов). MyObj имеет много полей String и целое число параметра.

Функция serialize берет менеджера и цену для сериализации массива с новой ценой.

Что-то вроде this:

use serde::{Serialize};
use serde_json;

#[derive(Serialize, Clone)]
pub struct MyObj {
    id: String,
    name: String,
    price: Option<u32>
}

pub struct MyObjManager {
    my_objs: Vec<MyObj>
}

fn get (manager: &MyObjManager, price: u32) -> Vec<MyObj> {
    manager.my_objs.iter()
        .map(|my_obj| {
            MyObj {
                price: Some(price),
                ..my_obj.clone() // string allocation
            }
        })
        .collect()
}

pub fn serialize (manager: &MyObjManager, price: u32) -> String {
    let my_objs = get(manager, price);
    serde_json::to_string(&my_objs).unwrap()
}

В этой реализации каждый вызов serialize выделяет много строк. Можно этого избежать?

NB: массив MyObj можно считать stati c и не изменяется во времени

...