又要开始罗里吧嗦的 第四章  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. 【JS】input输入框只能输入数字

    一.实现思路 input只能输入纯数字的思路其实很简单,监听输入框值的变化,每次输入检索输入框的值,将非数字的字段替换成空,再将此值赋予给输入框. 关键代码: \d:匹配数字 ^/d:全文匹配非数字 ...

  2. GCD之Source

    参考:http://blog.csdn.net/lengshengren/article/details/12905811

  3. Mouse单击高亮GridView数据行

    有网友需要对GridView控件作一些操作.不过有些复杂,Insus.NET细分他的要求,一步一步来实现.不过细分的每一步,亦是一个小功能.因此Insus.NET就单独实现,然后一起结合起来,就是可以 ...

  4. aspnetmvc和aspnetcoremvc的一些区别

    1.路由 控制器添加特性:  [RoutePrefix("api/controller")]  = >   [Route("api/[controller]&quo ...

  5. 【手记】解决Resharper 2018.x起本机license server不能用的问题

    ReSharper升级到2018版后,一直用的好好的本机license server(下称LS)不能用了,报The license server address is incorrect....在网上 ...

  6. http Socket长连接

    文档:http://www.cocoachina.com/ios/20160602/16572.html socket(套接字)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元,包含进行网 ...

  7. effective VBA

    For Append As: Open "1.txt" For Append As #1Open "1.txt"就是打开名为1.txt的文件For Append ...

  8. java设计模式-----22、状态模式

    概念: State模式也叫状态模式,是行为设计模式的一种.State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样. 根据这个概念,我们举个例子 public c ...

  9. 阿里数据源Druid配置详情

    <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-m ...

  10. JavaOne 2016主旨演讲畅谈Java近期及远期规划

    在 JavaOne 2016 主题演讲开场,来自 Oracle 的 Java 产品管理负责人 Sharat Chander 指出 Java 盛行于个人和工作的日常生活各个领域,无论是大数据.物联网甚至 ...