原文http://www.cnblogs.com/hmking/archive/2011/10/10/2205321.html
《High Performance JavaScript》一书对于JavaScript中的如何提高循环的性能介绍的十分详尽,自己写了些简单的代码进行了测试,测试结果竟然出乎意料。
首先需要说明的是,本次测试的浏览器版本为Mozilla Firefox V7.01、基于chrome内核的傲游V3.1.8.1000,至于IE8那个废材我实在无语(系统是XP,IE9装不了无法测试)。
书中的主要观点主要有下面几个:
1、除 for-in循环外,其他循环类型性能相当,难以确定哪种循环更快。选择循环类型应基于需求而不是性能。
2、减少迭代的工作量,包括减少对象成员和数组项查找的次数、如果数组元素的处理顺序与任务无关使用倒序循环可以略微提高循环性能。
3、减少迭代次数,介绍了最广为人知的限制循环迭代次数的模式称作“达夫设备”。
倒序循环
首先出问题的是倒序循环,一般在正常的循环中,每次运行循环体都要发生如下几个操作:
1、在控制条件中读一次属性(items.length),如果缓存了数组的长度,这一条可忽略
2、在控制条件中执行一次比较(i < items.length)
3、比较操作,察看条件控制体的运算结果是不是 true(i < items.length == true)
4、一次自加操作(i++)
5、一次数组查找(items[i])
6、一次函数调用(process(items[i]))
在倒序循环中,每次迭代中只进行如下操作:
1、在控制条件中进行一次比较(i == true)
2、一次减法操作(i--)
3、一次数组查询(items[i])
4、一次函数调用(process(items[i]))
倒序循环减少了操作,那么性能的提高虽说很微弱,但应该是百分百确定的对不?但 是我测试的结果却不尽然,简单说一下测试代码,首先创建一个长度为10000的数组,每一项为长度4-10的字符,每个循环体要进行的操作是判断字符串是 否为全数字,如果是,值累加1,最后每种循环都循环100次,做三次测试。先上代码:
测试n次后发现,while、do-while都要比for循环要快些,for寻找只是偶尔比前两个快,在火狐下do-while要被while快些,在chrome下不明显。
fox循环的倒序循环性能略微提升比较确定,但是不管在火狐还是在chrome下while、do-while的正循环都要快于倒序循环,这是咋回事?别问我,我也不知......
再上测试的截屏,这里不得不赞Firebug,它的profile可不chrome强多了,不过性能还是比不上chrome,尤其后面达夫设备的测试跟是明显。
在达夫设备测试之前先进行另外一项测试,一上面的for循环为例,如果把循环体内对数组项的操作单独另写一个函数,然后在循环内调用,性能会有什么样的影响呢?
测试的结果:调用外部函数的for循环比之前的for循环所用的时间,火狐下多了二十倍,chrome没那么夸张,也多用的50ms左右,同是浏览器,差距咋就这么大呢(火狐你也要坚强些,因为IE在这测试里连说话的资格也没有,哈哈)......
达夫设备
这里摘抄一下书中关于达夫设备的基本理念:每次循环中最多可 8 次调用 process()函数。循环迭代次数为元素总数除以8。 因为总数不一定是 8的整数倍, 所以 startAt 变量存放余数, 指出第一次循环中应当执行多少次 process()。比方说现在有 12 个元素,那么第一次循环将调用 process()4次,第二次循环调用 process()8 次,用 2 次循环代替了 12次循环。
下面我们比较一下for、while、Duff's Device三种循环:
经过n次测试,发现while、Duff's Device要比for要快,而while与Duff's Device竟然也不分伯仲啊,这、这、这.....while咋就这么强呢......
还有一点达夫设备实际上把八次迭代合在一次迭代中,如果每次对数组项的操作代码量较少的情况下你可以像上面的代码一样简单的复制八次,但是如果 操作量大一些的话为了便于阅读和调试源代码,你就必须把操作代码包装到另外一个process函数中,然后在达夫设备调用此函数,还记得我们前面的关于 for循环调用外部函数的测试吗?性能就会差太多了,可以看下面的测试:
看到测试结果了吧,惨不忍睹啊......还是用while或do-while循环吧......
相关推荐
达夫xg2021中控台上配件一整套达夫xg2021中控台上配件一整套达夫xg2021中控台上配件一整套达夫xg2021中控台上配件一整套达夫xg2021中控台上配件一整套达夫xg2021中控台上配件一整套达夫xg2021中控台上配件一整套达夫...
C语言编译的整个过程是非常复杂的,里面涉及到的编译器知识、硬件知识、工具链知识都是非常多的,深入了解整个编译过程对工程师理解应用程序的编写是有很大帮助的,希望大家可以多了解一些,在遇到问题时多思考、多...
赵老师的笔记~个人觉得是很好的东西啊~一共有两卷~
达夫啤酒
辅导班课程,启航资料不容错过 赵达夫高数的领航者
丹夫斯达夫
摘要车辆GPS数据中蕴含的车辆轨迹信息具有重要的理论和应用价值。为减少轨迹数据存储空间,提高数据分析及传送速度,提出了一种基于时空特性的轨迹数据压缩算法,根据
卡尔作曲家安装npm install --save https://github.com/kiselli/calDavComposer 用法 var composer = require ( 'calDavComposer' ) ;...composer . composeFromUrls ( arrayOfUrls ) . then ( function ( calendar ) {...
癌症捐赠门户网站Python Flask应用 Flask应用程序用于癌症捐赠门户,使用基本的Python,SQLite3,HTML,CSS和Javascript...考希克·贾达夫(Kaushik Jadhav) GitHub: : 媒介: : 领英(LinkedIn): : 作品集: :
托尼·范·埃德达夫设备上的伦纳德·科恩: 现在我听说有一个密码那个达夫打字了,它让负载满意但你并不真正关心编码,是吗? 它是这样的for,开关轻微的失败,性能提升困惑的开发者组成展开的循环,是的展开的循环...
达夫塔尔·马特里(Daftar Materi) 作曲家初始化 安装PHPUnit 膜盒 Membuat测试用例 自动装带器 作曲家转储自动加载 贾兰坎测验 参数pada命令PHPUnit Apakah PHPUnit hanya bisa digunakan di framework ...
介绍 DM-UY 4003-A数字媒体高级项目 纽约大学丹顿工程学院的De Angela L. Duff数字媒体高级项目部分,集成数字媒体。 2021年Spring 而是访问gitbook,这是一个更好的阅读体验:
CheatEngine72.exe
Imersao_Dev_Alura 西班牙伊夫桑达夫阿鲁拉演习的序幕。 De 22/02/21 a 02/03/21。 #JS #alura #imersaodev存储库...
代码整体结构是执行速度的决定因素之一。 代码量少不一定运行速度快, 代码量多也不一定运行速度慢。 性能损失与代码组织方式和具体问题解决办法直接相关。...减少迭代次数:达夫循环。在循环次数较多时可以有
我是DimS Gift Me Stars :glowing_star: ...达夫塔尔 :check_mark_button: 创作者 是的 贴纸制造商 :check_mark_button: 贴纸Gif制作器 :check_mark_button: 将贴纸转换为图像 :check_mark_button:
Aplikasi Grosir Obat adalah sebuah sistem kasir(销售点)和销售总监Danavela,Langavel,测试驱动开发。 达夫塔·伊西(Daftar Isi) 菲图尔 Fitur pada Aplikasi ini meliputi: Akun登录 登录dan注销用户 ...
渗透测试实务 托克 技能提升 基础的 挑战 基本的 中级 先进的 技能提升 TryHackMe Cyber1的出现[2019] CTF系列Vol.1 CC:笔测试 注射 福斯尼夫CTF 开采后基础 攻击者KB 基础的 TryHackMe Linux的PrivEsc ...
dddjffgcx 拉达夫
previous up contents next C 语言常见问题集 原著:Steve Summit 翻译:朱群英, 孙 云 修订版 0.9.4, 2005年6月23日 版权所有 © 2005 ... * 1.... * 2.... * 3.... o 3.10 我的编译器在结构中留下了空洞, 这导致空间浪费...