Rust性能-迭代器的enumerate方法是否会影响程序性能
Rust编程语言融合了多种编程法(programming paradigm),其中的命令式编程(imperative programming)所用的循环和函数式编程(functional programming)所提供的迭代器(iterator)可以加强数组或是切片的访问性能。
然而,在访问数组或是切片时,迭代器在每次迭代时只会回传元素的值或引用,而不会将索引值也跟着回传出来。这个问题虽然可以通过迭代器的enumerate
方法来轻松解决,enumerate
会让迭代器回传目前是第几次的迭代(从0开始数),这个次数值可以当作是目前访问到的元素的索引值,只是这样的作法会对程序性能有什么不良的影响呢?
我们先来看看以下代码:
let array = [2, 2, 3, 4, 5, 6, 7, 8];
for i in 0..array.len() {
println!("array[{}] = {}", i, array[i]);
}
以上程序,会利用for循环来遍历array
这个存在于堆栈内的数组,并将其所有索引值所对应的元素值通通印在屏幕上。
我们知道用for循环来遍历堆栈内的数组,性能跟和用for迭代器循环或是迭代器是一样的。那么如果现在我们是将以上程序改用for迭代器循环和enumerate
方法来完成呢?程序如下:
let array = [2, 2, 3, 4, 5, 6, 7, 8];
for (i, &n) in array.iter().enumerate() {
println!("array[{}] = {}", i, n);
}
通过enumerate
方法来枚举数组,会影响到性能吗?
性能实测
直接实际写一段程序来测试运算性能吧!这段程序可以在GitHub上取得:
https://github.com/magiclen/rust-performance-measurement/blob/master/benches/iter_enumerate.rs
根据测试结果,可以发现使用enumerate
方法和使用for循环的性能是差不多的,所以可以放心使用~
enumerate
枚举和原本迭代遍历只差在前者用Enumerate
结构体包裹了后者,并且多了一个计数变量字段,在每次调用next
方法时都会把该计数变量的值以元组(tuple)的方式与元素保存在一起,然后在计数变量加1后,回传该元组。next
方法的代码如下:
fn next(&mut self) -> Option<(usize, <I as Iterator>::Item)> {
self.iter.next().map(|a| {
let ret = (self.count, a);
self.count = 1;
ret
})
}
所以它的性能才会和for计数循环差不多。而如果遍历的对象不是堆栈内的数组,它的性能还会比for循环更好呢!
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgkjijg
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13