锈蚀提示和技巧

2020-07-12 06:12:38

Rust是一种面向速度和安全性的编程语言。在过去的几年里,Rust获得了大量的采用,开发人员非常喜欢它。尽管有许多其他的系统编程语言,但Rust是极少数能够在性能方面站稳脚跟的C/C++替代语言之一。

铁锈是我们在Polyath为我们即将推出的区块链Polymesh选择的语言。在这篇文章中,我将分享一些我最喜欢的Rust技巧和一些给新开发人员的提示。

枚举的大小可以容纳它们最大的变体。因此,建议在枚举中使用类似大小的变体,以避免内存布局不是最优的。如果需要,您可以考虑装箱较大的变体。请考虑以下示例:

enum foo{A(U64),B([U64;1000]),}enum FooBoxing{A(U64),B(Box<;[U64;1000]>;)}fn main(){let x=foo::A(0);//其大小为8008字节。设y=FooBoxing::a(0);//大小只有16个字节。println!(";foo size{:?}";,std::mem::size_of_val(&;x));println!(";FooBoxing size{:?}";,std::mem::size_of_val(&;y));}。

在上面的示例中,枚举foo的变体A在大小上比变体B小得多,但是用于两个变体的存储器布局将是相同的,因此当使用变体A时,它将具有非最佳性能。

对变量调用.clone()会创建其数据的副本,创建副本需要资源。因此,在大多数情况下,克隆会对性能产生负面影响,应该避免。通常,您可以将相同变量的引用传递给不同的函数,而不需要克隆它们。例如:

fn main(){let x=foo::new();func(x.clone());func(x.clone());//不需要此克隆}fn main(){let x=foo::new();func(x.clone());func(X);//在此调用后不需要//使用x}fn main(){let x=foo::new();//如果您能够编辑函数,则//您很可能能够将其修改为使用引用。//那么您将不需要使用任何克隆。函数(&;x);函数(&;x);}。

然后,这些测试中的每一个都被编译为单独的二进制文件,这需要更多的编译时间和空间。相反,您可以将测试文件作为模块添加到单个测试中,以便只生成单个二进制文件。您的新测试结构将如下所示:

使用这个技巧,我能够将我们在Polymesh的CI测试时间从26分钟缩短到8分钟。它的缺点是您不能更改一个测试文件并只编译该文件。即使您只更改了一个测试文件,它也将始终编译完整的二进制文件。对我们来说,编译单个文件仅比编译完整的二进制文件快约10秒,因此我们决定采用这种方法。

DBG宏可用于将EXPRESS的值和源代码打印到stderr。示例用法:

交换函数允许您直接交换两个变量,而无需创建临时变量。

使用std::mem;让mut x=5;让mut y=42;mem::exchange(&;mut x,&;mut y);assert_eq!(42,x);assert_eq!(5,y);

你可能已经知道了,是吗?可以想象为返回错误而不是恐慌的展开。而不是直接返回错误,是吗?实际上返回err(from::from(Err))。这意味着如果错误是可转换的,它将自动转换为正确的类型。

可以使用相同的名称声明宏、函数和类型(如Enum),然后使用一条IMPORT语句将它们全部导入到其他地方。

sccache可以缓存货物构建构件,以便它们可以跨工作区重用。这意味着,如果您有多个Rust项目,并且它们使用相同的依赖项,则sccache将允许您编译该依赖项一次,然后跨项目重用。它将为您节省编译时间和磁盘空间。锈蚀目标目录已经很大了,没有理由在那里存储冗余的二进制文件。

您可以使用Cargo:Cargo install sccache安装sccache。要启用sccache,您需要将RUSTC_wrapper=sccache添加到您的构建环境中。要做到这一点,一种方法是将export RUSTC_wrapper=sccache添加到您的.bashrc中。

它们是我最喜欢的两种防锈工具,如果你还没有用过,可以试一试。Clippy可以在您的代码中捕获各种Lint,并帮助您编写惯用的代码。要安装Clippy,请运行Rustup Component add clippy,要在您的工作区中运行Clippy,请执行Cargo Clippy。有关更多信息,请访问Clippy的GitHub。

顾名思义,rustfmt是一种根据样式准则格式化Rust代码的工具。要安装rustfmt,请运行rustup component add rustfmt,要在您的工作区中运行rustfmt,请执行Cargo fmt。有关更多信息,请访问rustfmt的GitHub。

我还想对锈蚀分析员进行大喊答题。它是Rust语言的实验性模块化编译器前端。对于我来说,它比任何其他的Rust编译器前端都工作得更好。我强烈建议大家试一试。

铁锈有很多东西可以提供,你每天都可以学到一些关于铁锈的新知识。我希望你从这篇文章中学到一些新的东西。如果您想添加什么或需要帮助,请随时留言或通过其他媒体联系我。