`

转 Javascript各种循环测试,达夫设备可用性分析

 
阅读更多

原文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次,做三次测试。先上代码:

View Code

 测试n次后发现,while、do-while都要比for循环要快些,for寻找只是偶尔比前两个快,在火狐下do-while要被while快些,在chrome下不明显。

 fox循环的倒序循环性能略微提升比较确定,但是不管在火狐还是在chrome下while、do-while的正循环都要快于倒序循环,这是咋回事?别问我,我也不知......

 再上测试的截屏,这里不得不赞Firebug,它的profile可不chrome强多了,不过性能还是比不上chrome,尤其后面达夫设备的测试跟是明显。

 在达夫设备测试之前先进行另外一项测试,一上面的for循环为例,如果把循环体内对数组项的操作单独另写一个函数,然后在循环内调用,性能会有什么样的影响呢?

View Code

 测试的结果:调用外部函数的for循环比之前的for循环所用的时间,火狐下多了二十倍,chrome没那么夸张,也多用的50ms左右,同是浏览器,差距咋就这么大呢(火狐你也要坚强些,因为IE在这测试里连说话的资格也没有,哈哈)......

 

 达夫设备

 这里摘抄一下书中关于达夫设备的基本理念:每次循环中最多可 8 次调用 process()函数。循环迭代次数为元素总数除以8。 因为总数不一定是 8的整数倍, 所以 startAt 变量存放余数, 指出第一次循环中应当执行多少次 process()。比方说现在有 12 个元素,那么第一次循环将调用 process()4次,第二次循环调用 process()8 次,用 2 次循环代替了 12次循环。

 下面我们比较一下for、while、Duff's Device三种循环:

View Code

 经过n次测试,发现while、Duff's Device要比for要快,而while与Duff's Device竟然也不分伯仲啊,这、这、这.....while咋就这么强呢......

 还有一点达夫设备实际上把八次迭代合在一次迭代中,如果每次对数组项的操作代码量较少的情况下你可以像上面的代码一样简单的复制八次,但是如果 操作量大一些的话为了便于阅读和调试源代码,你就必须把操作代码包装到另外一个process函数中,然后在达夫设备调用此函数,还记得我们前面的关于 for循环调用外部函数的测试吗?性能就会差太多了,可以看下面的测试:

View Code

 看到测试结果了吧,惨不忍睹啊......还是用while或do-while循环吧......

分享到:
评论

相关推荐

    达夫xg2021中控台上配件一整套

    达夫xg2021中控台上配件一整套达夫xg2021中控台上配件一整套达夫xg2021中控台上配件一整套达夫xg2021中控台上配件一整套达夫xg2021中控台上配件一整套达夫xg2021中控台上配件一整套达夫xg2021中控台上配件一整套达夫...

    赵达夫高等数学辅导讲义

    根据给定文件的信息,我们可以提炼出与“赵达夫高等数学辅导讲义”相关的知识点,主要聚焦于高等数学的学习和考研复习方面。 ### 高等数学基础概念 #### 1. 微积分学基础 微积分是高等数学的重要组成部分,包括...

    C语言编译全过程剖析

    宏定义用于文本替换,条件编译指令允许根据特定条件选择性地编译代码段,头文件包含用于导入外部符号声明和宏定义。预编译阶段生成预处理输出文件,通常以.i或.pp.c为扩展名。 2. **编译和优化**: - 编译器对...

    达夫啤酒

    【达夫啤酒】项目是基于C#编程语言的一个模拟实现,它可能是一个教学示例或者一个小型的游戏,用于展示如何利用编程技术来创建一个虚拟的啤酒制作或销售系统。在这个项目中,我们可以深入探讨C#语言的核心特性以及...

    2009考研高数赵达夫讲解

    辅导班课程,启航资料不容错过 赵达夫高数的领航者

    丹夫斯达夫

    1. **JavaScript基础**: 项目涉及JavaScript的基础语法,如变量声明(let, const, var)、数据类型(字符串、数字、对象、数组等)、控制流程(条件语句、循环)以及函数的使用。 2. **函数**: JavaScript中的函数...

    基于时空特性的GPS轨迹数据压缩算法_张达夫1

    本文主要探讨了GPS轨迹数据压缩算法,特别是基于时空特性的压缩方法,这对于处理大量车辆GPS数据,减少存储空间,提高数据分析和传输效率具有重要意义。GPS轨迹数据包含了丰富的车辆运动信息,但随着车辆数量和时间...

    Imersao_Dev_Alura:西班牙伊夫桑达夫阿鲁拉演习的序幕。 De 220221 a020321。#JS #alura #imersaodev

    伊夫桑达夫阿鲁拉演习,又称为"Imersão Dev Alura",是一个针对技术学习者,尤其是对JavaScript和前端开发感兴趣的人群而设计的活动。该活动旨在通过一系列密集的学习和实践,帮助参与者深入理解编程概念,特别是...

    calDavComposer:作曲卡尔达夫

    卡尔作曲家安装npm install --save https://github.com/kiselli/calDavComposer 用法 var composer = require ( 'calDavComposer' ) ;...composer . composeFromUrls ( arrayOfUrls ) . then ( function ( calendar ) {...

    Cancer-Donate-Portal-Python-Flask-App:使用基本的Python,SQLite3,HTML,CSS和Javascript的Flask App,用于癌症捐赠门户

    癌症捐赠门户网站Python Flask应用 Flask应用程序用于癌症捐赠门户,使用基本的Python,SQLite3,HTML,CSS和Javascript...考希克·贾达夫(Kaushik Jadhav) GitHub: : 媒介: : 领英(LinkedIn): : 作品集: :

    程序员为什么还要刷题-cpp_poetry:为后代保存C++Slack#poerty频道的艺术

    托尼·范·埃德达夫设备上的伦纳德·科恩: 现在我听说有一个密码那个达夫打字了,它让负载满意但你并不真正关心编码,是吗? 它是这样的for,开关轻微的失败,性能提升困惑的开发者组成展开的循环,是的展开的循环...

    PHPUnitTest-Indonesia-Tutorial:练习第一个教程-印尼语PowerPointPHP单元测试教程

    达夫塔尔·马特里(Daftar Materi) 作曲家初始化 安装PHPUnit 膜盒 Membuat测试用例 自动装带器 作曲家转储自动加载 贾兰坎测验 参数pada命令PHPUnit Apakah PHPUnit hanya bisa digunakan di framework ...

    浅谈js算法和流程控制

    达夫设备(Duff's Device)是一种用于批量处理数据的技巧,通过将数据分组并在循环中处理,可以减少循环的迭代次数。这种方法在处理大块数据时能显著提高效率。 最后,避免重复计算是另一个优化策略。如果一个计算...

    培训与开发项目评估教材.ppt

    斯达夫彼姆1966年认为评估是为决策提供信息的过程,海布林1974年强调了影响因素的分析和反馈。斯德1980年提出评估是系统收集和分析方案改变过程的程序,戈尔斯坦1986年进一步完善了这一概念,认为它是决策判断的基础...

    SP-2021高级项目-达夫

    介绍 DM-UY 4003-A数字媒体高级项目 纽约大学丹顿工程学院的De Angela L. Duff数字媒体高级项目部分,集成数字媒体。 2021年Spring 而是访问gitbook,这是一个更好的阅读体验:

    培训与开发项目评估PPT教案学习.pptx

    【培训与开发项目评估】是人力资源管理中的一个重要环节,它涉及到对组织提供的各种培训活动的效果进行系统的、客观的分析和评价。评估的目的不仅在于衡量培训的实际成果,还在于改进和优化培训项目,确保其能够有效...

    2022年上海工程技术大学专升本复习资料文件.pdf

    - 政策科学与公共政策分析:结合政策研究与行政实践,代表人物有普雷斯曼、韦尔达夫斯基等。 4. **公共管理学的学科特征**: - 研究对象广泛,跨学科性强,涉及政治、经济、社会等多个领域。 - 实证与规范相结合...

    CheatEngine72.exe

    CheatEngine72.exe

    davzia-x:Davzia X的主要平台

    最后,考虑到现代Web的多设备兼容性需求,Davzia X可能内置了对移动设备的支持,确保HTML页面在不同屏幕尺寸和分辨率上都能良好展示。这通常通过响应式设计和媒体查询来实现。 总之,Davzia X作为一个主要基于HTML...

Global site tag (gtag.js) - Google Analytics