【Rust日报】2020-11-13 - 使用内部非泛型函数来避免静态分发导致的编译速度下降和二进制

PossibleRust.com

PossibleRust.com是上线不久的专注于分享Rust的个人博客网站,作者从2013年0.8版开始学习Rust,并声称到现在他也一直在学新的Rust的东西。比如最新的一篇博文Non-Generic Inner Functions讲到如何使用内部非泛型函数来避免静态分发导致的编译速度下降和二进制体积膨胀的问题,强烈推荐一看。(占个坑,有时间我翻译一下)链接:https://www.possiblerust.com/pattern/non-generic-inner-functions

Are out parameters idiomatic in Rust?

Out parameter中文应该翻译成传出参数?其实很好理解,大家都碰到过或用过。举个例子,如下第二种即Out parameter:

fn foo() -> i32 {
   // body elided
}

let x = foo();
fn foo(out: &mut i32) {
   // body elided
}

let mut x = 0;

foo(&mut x);

作者这篇文章提供了在Rust中Out parameter的最佳实践:

  • 能不使用传出参数的情况下尽量不要使用

有几个原因:1) 返回值的方式语义上更明确,更清晰。2) Rust有非常丰富的数据类型,如果需要返回多个参数可以用tuple包裹起来,没必要作为out parameter来返回。3) Rust编译器大都数情况下对返回值的拷贝有优化,几乎能达到和out parameter同样的效果;

  • 只有一种情况推荐使用Out parameter: 调用方传递给函数的是某种形式的buffer

比如标准库的Read trait:

pub trait Read {
   fn read(&mut self, buf: &mut [u8]) -> Result<usize>;
}

这里的read()比较适合使用out parameter。链接:https://steveklabnik.com/writing/are-out-parameters-idiomatic-in-rust

Writing BPF code in Rust

BPF是Berkeley Packet Filter(伯克利包过滤器)的缩写,这是一个用于过滤(filter)网络报文(packet)的架构。其实 BPF 可谓是名气不大,作用不小的典范。BPF 即为 tcpdump 抑或 wireshark 乃至网络监控(Network Monitoring)领域的基石。以 tcpdump 为例:熟悉网络监控(network monitoring)的读者大抵都知道 tcpdump 依赖于 pcap 库,tcpdump 中的诸多核心功能都经由后者实现。而pcap就是基于内核中的BPF模块。这篇文章作者介绍了自己公司提供了几个方便使用Rust编写BPF/eBPF程序的crate。文章链接:https://blog.redsift.com/labs/writing-bpf-code-in-rust/

更多参考资料了解BPFeBPF 简史: https://www.ibm.com/developerworks/cn/linux/l-lo-eBPF-history/index.htmlBPF: A New Type of Software:http://www.brendangregg.com/blog/2019-12-02/bpf-a-new-type-of-software.html

rkyv - a zero-copy deserialization framework for Rust

一个类似于FlatBuffers的序列化框架,作者声称zero-copy。


上一篇:深入浅出 BPF TCP 拥塞算法实现原理


下一篇:Wireshark的使用