循环是编程中是最为常见的结构,优化循环是性能优化中很重要的一个部分。

  1. 减值迭代:大多数循环使用一个从0开始、增加到某个特定值的迭代器。在很多情况下,从最大值开始,在循环中不断减值的迭代器更加高效。
  2. 简化终止条件:如前所说,属性查找或者其它O(n)的操作不应该出现在终止条件这个地方。
  3. 简化循环体:循环体是执行最多的,一定要确保没有某些可以被很容易移出循环的密集计算。
  4. 使用后测试循环:最常用的for循环和while循环都是前测试循环,而如do-while为后测试循环,可以避免最初终止条件的计算,因此运行更快。

当循环的次数是确定的,不用循环往往更快。如:数组有三个元素,直接对数组操作,展开循环可以消除建立循环和处理终止条件的额外开销。如果循环中的迭代数不能事先确定,那可以使用一种叫做Duff装置的技术。这个技术是以其创建者Tom Duff命名的,最早在C语言中使用这项技术。Jeff Greenberg用javascript实现了Duff装置。基本概念是通过计算迭代的次数是否为8的倍数将一个循环展开为一系列语句。

//credit: Jeff Greengerg for JS implementation of Duff's Device
var iterations = Math.floor(values.length / 8 );
var startAt = values.length % 8 ;
var i = 0;
do {
switch(startAt){
case 0:process(values[i++]);
case 7:process(values[i++]);
case 6:process(values[i++]);
case 5:process(values[i++]);
case 4:process(values[i++]);
case 3:process(values[i++]);
case 2:process(values[i++]);
case 1:process(values[i++]);
}
startAt = 0;
}while(-- iterations > 0 );

Duff装置的实现是通过将values数组中元素个数除以8来计算出循环需要进行多少次迭代,然后使用取整的下限函数确保结果是整数。当然,可能会有一些不能被处理到的元素,这个数量保存在startAt变量中,首次执行会对其进行额外的调用 。

由Andrew B. King在Speed Up Your Site(New Riders,2003)提出更快的Duff装置:

//credit :Speed Up Your Site (New Riders,2003)
var iterations = Math.floor(values.length /8 );
var leftover = value.length % 8;
var i=0;
if(leftover >0){
do{
process(values[i++]);
}while(--leftover >0);
}
do {
process(values[i++]);
process(values[i++]);
process(values[i++]);
process(values[i++]);
process(values[i++]);
process(values[i++]);
process(values[i++]);
process(values[i++]);
}while(--iterations > 0);

这个方法几乎比原始的Duff装置实现快40%。

对于大数值量使用展开循环可以节省很多时间,小数据量,额外的开销则划不来了。

javascript循环---性能优化的更多相关文章

  1. JavaScript代码性能优化总结

    JavaScript 代码性能优化总结 尽量使用源生方法 javaScript是解释性语言,相比编译性语言执行速度要慢.浏览器已经实现的方法,就不要再去实现一遍了.另外,浏览器已经实现的方法在算法方面 ...

  2. javascript的性能优化tips

    谈到javascript的性能优化,有好多点,比如把script放到离body闭合标签附近,合并多个script标签等等,还有一些代码的性能,for的性能不如while的性能好,用while模拟for ...

  3. 【转】js JavaScript 的性能优化:加载和执行

    JavaScript 的性能优化:加载和执行 转自:https://www.ibm.com/developerworks/cn/web/1308_caiys_jsload/ 随着 Web2.0 技术的 ...

  4. Javascript常见性能优化

    俗话说,时间就是生命,时间就是金钱,时间就是一切,人人都不想把时间白白浪费,一个网站,最重要的就是体验,而网站好不好最直观的感受就是这个网站打开速度快不快,卡不卡. 当打开一个购物网站卡出翔,慢的要死 ...

  5. JavaScript code 性能优化

    1 1 1 JavaScript 性能优化 prototype 闭包 Closure 内存泄漏 event system 1 定义类方法以下是低效的,因为每次构建baz.Bar的实例时,都会为foo创 ...

  6. JavaScript 的性能优化:加载和执行

    随着 Web2.0 技术的不断推广,越来越多的应用使用 javascript 技术在客户端进行处理,从而使 JavaScript 在浏览器中的性能成为开发者所面临的最重要的可用性问题.而这个问题又因 ...

  7. [转]JavaScript 的性能优化:加载和执行

    原文链接:http://www.ibm.com/developerworks/cn/web/1308_caiys_jsload/index.html?ca=drs- JavaScript 的性能优化: ...

  8. JavaScript的性能优化:加载和执行

    随着 Web2.0 技术的不断推广,越来越多的应用使用 javascript 技术在客户端进行处理,从而使 JavaScript 在浏览器中的性能成为开发者所面临的最重要的可用性问题.而这个问题又因 ...

  9. javascript基础-性能优化

    优化点 性能检测 基调网络 http://www.cesule.com/cesule/status/show/3496d91653a14743af2bd2e261aee204 阿里测 http://a ...

随机推荐

  1. python之gui-tkinter可视化编辑界面 自动生成代码

    首先提供资源链接 http://pan.baidu.com/s/1kVLOrIn#list/path=%2F

  2. oracle数据库备份、还原 (如何将Oracle 11g备份的dat文件导入到10g数据库里面)

    如何将Oracle 11g备份的dat文件导入到10g数据库里面 解决方法:      导出的时候后面加上目标数据库的版本号   导出: 在SQL plus下执行:create or replace  ...

  3. java一些问题的思考

    1.思考 为什么java规定作为程序入口点的main() 方法静态的? 在java中,main()方法是java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这 ...

  4. C#仪器数据文件解析-XPS文件

    XPS为微软推出的类似于Adobe PDF的一种文件格式,个人认为XPS很好,但毕竟PDF已经被大家所熟知,因此XPS的使用很少,也少有仪器数据输出为该格式. XPS百度百科:https://baik ...

  5. Python自学笔记-paramiko模块(Mr serven)

    文章出处:http://www.cnblogs.com/wupeiqi/articles/5095821.html SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: #!/u ...

  6. php 连接mysql数据库以及增删改查

    php 连接数据库 一般是用面向对象的方法,需要先创建一个对象,即造一个连接对象,然后再写sql语句,(增改查删),最后执行sql语句 其中在创建连接对象时 我们用到的是MySQLI  是不区分大小写 ...

  7. JAVA中子类会不会继承父类的构造方法

    声明:刚刚接触java不久,如果理解有错误或偏差望各位大佬强势批判 java中子类能继承父类的构造方法吗? 父类代码: class Father { String name ; //就不set/get ...

  8. 反射型 DDoS 攻击的原理和防范措施

    随着僵尸网络的兴起,同时由于攻击方法简单.影响较大.难以追查等特点,分布式拒绝服务攻击(DDoS,Distributed Denial of Service)得到快速壮大和日益泛滥. 成千上万主机组成 ...

  9. layim+signalr2.0在线轻聊版解决方案

    本内容有版权限制,仅提供学习交流参考等等,请勿随便转载或者代码商用.     /** layui-v2.1.5 MIT License By http://www.layui.com */; layu ...

  10. Python读取SQLite文件数据

    近日在做项目时,意外听说有一种SQLite的数据库,相比自己之前使用的SQL Service甚是轻便,在对数据完整性.并发性要求不高的场景下可以尝试! 1.SQLite简介: SQLite是一个进程内 ...