13 Rust语言中的函数式语言功能:迭代器与闭包
函数式编程风格通常包括将函数作为另一个函数的参数、返回值,将函数作为值赋值给变量,以供后续执行
本章中我们将会介绍以下内容:
闭包:一个可以存储在变量里的类似函数的数据结构
迭代器:一种处理元素序列的方式
如何使用这些功能来改进第十二章的I/O项目
这两个功能的性能(剧透警告:它们的速度超乎你的想象)
我40米的大刀已经饥渴难耐了,让我们攻下这一章!
13.4 性能对比:循环VS迭代器
为了决定使用哪个实现我们来测试一下哪个版本更快:是for循环更快还是迭代器更快,如下是测试代码,结果迭代器更快!
test bench_search_for ... bench: 19,620,300 ns/iter (+/- 915,700)
test bench_search_iter ... bench: 19,234,900 ns/iter (+/- 657,200)
我们再多谈一点迭代器,迭代器作为一种更高级的抽象,被编译成了与手写的底层代码大体一致性能代码。迭代器是Rust的零成本抽象之一,它意味着抽象并不会引入运行时开销
另一个例子:音频解码器的代码
let buffer: &mut [i32];
let coefficients: [i64; 12];
let qlp_shift: i16;
for i in 12..buffer.len() {
let prediction = coefficients.iter()
.zip(&buffer[i - 12..i])
.map(|(&c, &s)| c * s as i64)
.sum::<i64>() >> qlp_shift;
let delta = buffer[i];
buffer[i] = prediction as i32 + delta;
}
像音频解码器这样的程序通常看重性能,这里我们创建了一个迭代器,使用了两个适配器,接着消费了其值
闭包和迭代器是Rust受函数式子编程语言观念所启发的功能,他们对Rust以底层的性能来明确表达高级概念的能力有很大贡献,同时他们也不影响性能
那下一章,让我们看看更多的cargo功能,将好的项目分享给全世界