如何更好地存储字符串以避免许多克隆?

时间:2017-02-07 18:48:55

标签: rust traits

我正在使用tokio的UdpCodec特质:

pub trait UdpCodec {
    type In;
    type Out;
    fn decode(&mut self, src: &SocketAddr, buf: &[u8]) -> Result<Self::In>;
    fn encode(&mut self, msg: Self::Out, buf: &mut Vec<u8>) -> SocketAddr;
}

In的关联类型是(SocketAddr, Vec<Metric>)Metric定义为:

#[derive(Debug, PartialEq)]
pub struct Metric {
    pub name: String,
    pub value: f64,
    pub metric_type: MetricType,
    pub sample_rate: Option<f64>,
}

我使用了拥有的字符串来避免关联类型的生命周期限制。但是我也使用这些度量标准名称进行HashMap查找和插入,这涉及大量克隆,因为我在其他函数中借用了度量标准。

如何更好地在此Metric类型中存储字符串以避免许多低效克隆?使用Cow类型已经超出了我的想法,但它显然也有一生的关联。

1 个答案:

答案 0 :(得分:2)

扩展@Jos​​h的建议,我建议使用实习。

根据您的任务的内存或CPU密集程度,选择:

  • 双重哈希图:ID&lt; - &gt; String,在组件之间共享
  • 单个哈希映射:String - &gt; Rc<str>

如果你能买得起后者,我绝对会建议。另请注意,您可以在MetricTypeRc内折叠Rc<(MetricType, str)>

然后你仍然需要左右调用clone,但每个只是一个廉价的非原子增量操作......并且移动到多线程就像交换Arc {{1}一样简单}}