又要开始罗里吧嗦的 第四章  Summary 了。

  这一次我尽量精简语言。

  如果你认为 重复调用一个方法数次有点辣眼睛的话 比如:

function test(i){
  process(i++);
  process(i++);
  process(i++);
  process(i++);
}

那么你可能选择更优解 比如:

function test(i){
for(j=0,j<4,j++){
  process(i++);
}
}

但其实第一种性能优于第二种。

有人可能已经想到  Duff's Device 了,没错 这一章就是讲算法和流程控制。

文章首先解释的是循环:

      四种循环

  1. for         :初始化体,前测条件,后执行体,循环体
  2. while  :预测试条件,循环体
  3. do-while :循环体,后测试条件体
  4. for-in  :枚举任何对象的命名属性(字符串,包括从原型链继承来的属性)

  两个因素

  1. 每次迭代干什么
  2. 迭代的次数

举个例子:

情况1、如果你的循环体 没有任何东西,那么循环100次等于一次不循环。 这是循环的性能等于迭代的次数了。

情况2、现在加一个条件,你的循环体里只做了一件小事 比如声明一个变量。 那么现在迭代的次数对循环的性能依旧影响深远。

情况3、如果循环是500000 次。那么迭代最好只干不得不干的事,迭代的次数对性能的影响很大。

  如何减少迭代次数?

用局部变量来充当缓存的事前几章已经没少讲,所以第一种因素 每次迭代做的事 就不提了。倒序循环可以略微提高循环性能,这是一种典型的分析循环中做的所有事,并精简它的例子。

for (var i=items.length; i--; ){
process(items[i]);
}

重点是如何减少迭代次数。直接上代码:

 //credit: Jeff Greenberg
var iterations = Math.floor(items.length / 8),
startAt = items.length % 8,
i = 0;
do {
switch(startAt){
case 0: process(items[i++]);
case 7: process(items[i++]);
case 6: process(items[i++]);
case 5: process(items[i++]);
case 4: process(items[i++]);
case 3: process(items[i++]);
case 2: process(items[i++]);
case 1: process(items[i++]);
}
startAt = 0;
} while (--iterations);

这个方法反应了一种思想,循环处理的原因应该是不确定目标的数量或目标数量太大而不得不循环,不是仅仅为了处理每一项而循环。

如果我需要处理一个已知count为10的集合项 我大可以直接调用10次。

还有一个稍快的版本:

 //credit: Jeff Greenberg
var i = items.length % 8;
while(i){
process(items[i--]);
}
i = Math.floor(items.length / 8);
while(i){
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
}

这样做能大大减少循环次数,而效果就是 500'000 次迭代中,运行时间比普通循环减少到 70%。但是这不应该仅仅适用于此,这应该是一种思想而不是告诉你这么做会更快。

类似的可以看尾递归和递归的故事。

读高性能JavaScript编程 第四章 Duff's Device的更多相关文章

  1. 读高性能JavaScript编程 第四章 Conditionals

    if else 和 switch    &&    递归 if else 和 switch 一般来说,if-else 适用于判断两个离散的值或者判断几个不同的值域.如果判断多于两个离散 ...

  2. 读高性能JavaScript编程 第三章

    第三章  DOM Scripting  最小化 DOM 访问,在 JavaScript 端做尽可能多的事情. 在反复访问的地方使用局部变量存放 DOM 引用. 小心地处理 HTML 集合,因为他们表现 ...

  3. 读高性能JavaScript编程学英语 第一章第三页第一段话

    When the browser encounters a <script> tag, as in this HTML page, there is no way of knowing w ...

  4. 读高性能JavaScript编程 第二章 让我知道了代码为什么要这样写

    代码为什么要这样写? function initUI(){ var doc = document, bd = doc.body, links = doc.getElementsByTagName_r( ...

  5. 读高性能JavaScript编程 第一章

    草草的看完第一章,虽然看的是译文也是感觉涨姿势了, 我来总结一下: 由于 大多数浏览器都是 single process 处理 ui updatas and js execute 于是产生问题: js ...

  6. 读《编写可维护的JavaScript》第四章总结

    第四章 变量 函数和运算符 4.1 ① 变量声明 变量声明是通过var语句来完成的,并且所有的var语句都提前到包含这段逻辑的函数的顶部执行. function doSomething() { + v ...

  7. [转]Windows Shell 编程 第四章 【来源 http://blog.csdn.net/wangqiulin123456/article/details/7987933】

    第四章 文件的本质 以前,所有文件和目录都有一个确定的属性集:时间,日期,尺寸,以及表示‘只读的’,‘隐藏的,‘存档的’,或‘系统的’状态标志.然而,Windos95(及后来的WindowsNT4.0 ...

  8. 高性能JavaScript 编程实践

    前言 最近在翻<高性能JavaScript>这本书(2010年版 丁琛译),感觉可能是因为浏览器引擎的改进或是其他原因,书中有些原本能提高性能的代码在最新的浏览器中已经失效.但是有些章节的 ...

  9. Windows核心编程 第四章 进程(下)

    4.3 终止进程的运行 若要终止进程的运行,可以使用下面四种方法: • 主线程的进入点函数返回(最好使用这个方法) . • 进程中的一个线程调用E x i t P r o c e s s函数(应该避免 ...

随机推荐

  1. 让 markdown 生成带目录的 html 文件

    安装 npm install -g i5ting_toc 用法 进入 markdown 文件所在的文件夹 举个栗子: 你的sample.md文件放在桌面上 cd /Users/dora/Desktop ...

  2. 【一个小功能】点击图标/链接发起QQ临时会话

    有时候,我们需要实现在网页上点击一个QQ图标来实现QQ临时会话,这样不用添加好友,也能满足及时沟通的需求. 实现方案比较简单,只是为a标签修改href属性,代码如下 <a href=" ...

  3. Java源码阅读(不断补充)

    java.util.LinkedList LinkedList是实现了List接口的双链表实现,拥有list的所有方法并且允许所有元素(包括null). 双向链表也叫双链表,是链表的一种,它的每个数据 ...

  4. 并发编程之 Semaphore 源码分析

    前言 并发 JUC 包提供了很多工具类,比如之前说的 CountDownLatch,CyclicBarrier ,今天说说这个 Semaphore--信号量,关于他的使用请查看往期文章并发编程之 线程 ...

  5. 南方IT教材反馈

    为了进一步提升教材质量,大家可以在底部留言区反馈您发现的任何问题或建议,谢谢!           最终我们将从所有读者中找出幸运读者发放奖品! 好教材也有我的一份功劳!

  6. angular项目使用Swiper组件Loop时 ng-click点击事件失效处理方法

    在Angular项目中,使用swiper组件进行轮播展示时,存在将swper的loop设置为true时,部分页面的ng-click失效. 原因:将swiper中的looper设置为true时,为了视觉 ...

  7. js 时间格式与时间戳的相互转换示例代码

    一.时间转换时间戳 function transdate(endTime){ var date=new Date(); date.setFullYear(endTime.substring(0,4)) ...

  8. Java基础——JSP(三)

    一. JavaBean 是一种特殊的java类,它遵从一定的设计模式,开发工具和其他组件可以根据这种模式来调用javaBean.它是使用一种符合某些命名方法和设计规范的java类. -- 这个类是可序 ...

  9. 【CentOS】设置服务开机自动启动

    CentOS安装好apache.mysql等服务器程序后,并没有设置成开机自动启动的,为避免重启后还要手动开启web等服务器,还是做下设置好,其实设置很简单,用chkconfig命令就行了. 例如,要 ...

  10. mysql小试题3

    查询结果: