私は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
タイプを使用することは私の頭をよぎりましたが、それは明らかに生涯の関連性も持っています。
@Joshの提案を拡張して、インターンを使用することをお勧めします。
タスクのメモリまたはCPUの負荷に応じて、次のいずれかを選択します。
ID
<-> String
、コンポーネント間で共有String
->Rc<str>
後者を買う余裕があれば、絶対にお勧めします。またMetricType
、Rc
:内で折りたたむことができる可能性があることにも注意してくださいRc<(MetricType, str)>
。
次にclone
、左と右を呼び出す必要がありますが、それぞれは安価な非アトミックインクリメント操作です...そしてマルチスレッドへの移行は、を交換Arc
するのと同じくらい簡単ですRc
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加