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循环更好呢!

Rust性能分析-迭代器的enumerate方法是否会影响程序性能相关推荐

  1. 影响程序性能的几个关键因素

    由于摩尔定律的限制,单核cpu早已经难以满足性能要求,现代所使用的cpu架构一般都是使用多核架构,多核架构其实对程序编程有更好的要求,<Is parallel Programming Hard ...

  2. 微信小程序开发04 性能优化:借助微信开发者工具提升小程序性能

    你好,我是周俊鹏. 前几节课我们分别从架构层(双线程模型).链路层(授权模型).和应用层(自定义组件)三个角度学习了小程序的技术要点.它们能帮你完成一个微信小程序的基本业务逻辑和交互逻辑. 逻辑的第一 ...

  3. 基于matlab的2ask频带传输系统仿真与性能分析,基于MATLAB的2ASK频带传输系统仿真与性能分析汇总...

    基于MATLAB的ASK频带传输统仿真与性能 分析 学生姓名:xxx 指导老师:xx 摘要本课程设计主要运用MATLAB集成环境下的Simulink仿真平台进行ASK频带传输系统仿真,并把运行仿真结果 ...

  4. 【chrome devtools】前端性能分析之chrome devtools的使用 前端项目内存性能优化的建议 前端浏览器崩溃卡死 前端性能分析实战

    最近有个项目,静置一段时间,chrome内存一直上涨.就像是这样: 内存会慢慢悄悄的往上涨,最终可以到达2000多M,直至浏览器崩溃卡死.很明显,这应该是内存泄漏了. 但是只知道内存泄漏,并不知道究竟 ...

  5. java 脚本引擎性能_Java SE 6 入门之脚本引擎加大程序性能

    Java SE 6 入门之脚本引擎加大程序性能 Java SE 6较Java SE5有了很大的改进,它的性能更强,而且是专为Vista所设计,这就象征着Java SE 6将是Vista上的最佳抉择.而 ...

  6. MYSQL性能调优及架构设计学习笔记-影响MYSQL性能的相关因素之实例分析

    为什么80%的码农都做不了架构师?>>>    需求概述 一个简单的讨论区系统,需要有用户,用户组,组讨论区这三部分基本功能 简要分析 1) 须要存放用户数据的表: 2) 须要存放分 ...

  7. abap性能优化——利用凭证的number ranger提高abap程序性能

    当我们的程序需要搜索某些凭证的时侯,常常会涉及到比较庞大的数据表,比如BSEG, MSEG, VBRP等等,如果这时又无法获取凭证号码等一些关键字段的值,那么程序必然会消耗非常多的资源.这种情况下,下 ...

  8. Linux性能分析命令工具汇总

    转自:http://rdc.hundsun.com/portal/article/731.html?ref=myread 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章. ...

  9. DevTools 实现原理与性能分析实战

    作者:vivo 互联网浏览器内核团队-Li Qingmei 一.引言 从 2008 年 Google 释放出第一版的 Chrome 后,整个 Web 开发领域仿佛被注入了一股新鲜血液,渐渐打破了 IE ...

最新文章

  1. 2020中国人工智能年度评选开启,4大类别7大奖项申报正式启动
  2. python怎么编辑文件夹_python创建修改文件
  3. Thymeleaf设置属性值
  4. 请列举一下在jvm中哪些对象可以当作root对象?
  5. django2.2 连接redis集群
  6. SCU 3133(博弈)
  7. 图片下载中文传输转义问题
  8. django 路由分发 url分层
  9. 一招解决4道leetcode hard题,动态规划在字符串匹配问题中的应用
  10. Linux配置手册(八)基于MySQL构建PHP环境
  11. android 关闭软键盘_「安卓之父」创立的 Essential 公司宣布关闭
  12. 家庭理财项目 分析
  13. HBuilderX踩坑记录(1)—— vivo iqoo z1开启adb调试
  14. Linux下如何聊天-irc,MSN,ICQ,QQ你会用了吗?
  15. 在WINDOWS下的Services.mscl里有好几个ORACLE的SERVICES的一些作用
  16. 残留的过往伤感QQ日志_说太多,不如沉默
  17. android 多个按键精灵,给大家分享一个,按键精灵安卓版,找多图, 以及找多图返回多个坐标的,相信大家绝对用得到 _ 按键精灵手机版 - 按键精灵论坛...
  18. 【arcgis 批量将属性表批量导出成excel】
  19. 在阿里我是如何当面试官的
  20. 大明宫发动机和个人的考虑发达国家

热门文章

  1. PowerDesigner 15生成数据字典
  2. S-DES加密与解密
  3. jdk1.8新特性之lambda表达式及在Android Studio中的使用举例
  4. 《Android游戏开发详解》——第2章,第2.10节使用对象
  5. Linux的网络管理命令使用总结
  6. PyQt5教程(三)——布局管理
  7. SQL error: cannot use the special principal 'sa'
  8. 【iOS-Cocos2d游戏开发之六】对触屏事件追加讲解,解决无法触发ccTouchMoved事件[重要!]...
  9. 常量中有换行符 是怎么回事?
  10. Django基础-Web框架-URL路由