读高性能JavaScript编程 第四章 Duff's Device
又要开始罗里吧嗦的 第四章 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 了,没错 这一章就是讲算法和流程控制。
文章首先解释的是循环:
四种循环
- for :初始化体,前测条件,后执行体,循环体
- while :预测试条件,循环体
- do-while :循环体,后测试条件体
- for-in :枚举任何对象的命名属性(字符串,包括从原型链继承来的属性)
两个因素
- 每次迭代干什么
- 迭代的次数
举个例子:
情况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的更多相关文章
- 读高性能JavaScript编程 第四章 Conditionals
if else 和 switch && 递归 if else 和 switch 一般来说,if-else 适用于判断两个离散的值或者判断几个不同的值域.如果判断多于两个离散 ...
- 读高性能JavaScript编程 第三章
第三章 DOM Scripting 最小化 DOM 访问,在 JavaScript 端做尽可能多的事情. 在反复访问的地方使用局部变量存放 DOM 引用. 小心地处理 HTML 集合,因为他们表现 ...
- 读高性能JavaScript编程学英语 第一章第三页第一段话
When the browser encounters a <script> tag, as in this HTML page, there is no way of knowing w ...
- 读高性能JavaScript编程 第二章 让我知道了代码为什么要这样写
代码为什么要这样写? function initUI(){ var doc = document, bd = doc.body, links = doc.getElementsByTagName_r( ...
- 读高性能JavaScript编程 第一章
草草的看完第一章,虽然看的是译文也是感觉涨姿势了, 我来总结一下: 由于 大多数浏览器都是 single process 处理 ui updatas and js execute 于是产生问题: js ...
- 读《编写可维护的JavaScript》第四章总结
第四章 变量 函数和运算符 4.1 ① 变量声明 变量声明是通过var语句来完成的,并且所有的var语句都提前到包含这段逻辑的函数的顶部执行. function doSomething() { + v ...
- [转]Windows Shell 编程 第四章 【来源 http://blog.csdn.net/wangqiulin123456/article/details/7987933】
第四章 文件的本质 以前,所有文件和目录都有一个确定的属性集:时间,日期,尺寸,以及表示‘只读的’,‘隐藏的,‘存档的’,或‘系统的’状态标志.然而,Windos95(及后来的WindowsNT4.0 ...
- 高性能JavaScript 编程实践
前言 最近在翻<高性能JavaScript>这本书(2010年版 丁琛译),感觉可能是因为浏览器引擎的改进或是其他原因,书中有些原本能提高性能的代码在最新的浏览器中已经失效.但是有些章节的 ...
- Windows核心编程 第四章 进程(下)
4.3 终止进程的运行 若要终止进程的运行,可以使用下面四种方法: • 主线程的进入点函数返回(最好使用这个方法) . • 进程中的一个线程调用E x i t P r o c e s s函数(应该避免 ...
随机推荐
- 记一次java程序占用cpu超高排查
1.首先通过top命令查看占用cpu过高的pid #top top - 18:07:25 up 48 days, 1:07, 3 users, load average: 11.94, 11.9 ...
- eclipse使用tomcat:run启动项目时修改默认端口
命令:-Dmaven.tomcat.port=8081 tomcat:run
- Vue怎么使用Echarts创建图表
摘要:在后台管理系统中,我们经常会遇到图表,比如说:柱形图,饼状图,折线图,雷达图等等,而用来写图表插件有很多,我这里主要介绍Echarts在项目里怎么使用,官网地址如下:https://echart ...
- Git Windows客户端保存用户名和密码
解决Git Windows客户端保存用户名和密码的方法,至于为什么,就不想说了. 1. 添加一个HOME环境变量,值为%USERPROFILE% 2. 开始菜单中,点击“运行”,输入“%Home%”并 ...
- VS2012 扩展和更新里 插件状态 为禁用 的解决办法!
在vs2012 里安装完插件,重启VS,结果 插件没有加载,查看 扩展和更新,里面显示禁用,如图: 解决方法: 点击界面上 “启用每用户扩展的加载” 蓝色文字,弹出如下界面: 选中 以管理员运行时加载 ...
- django2.1---终端打印orm转义的sql语句
print(connection.queries)可以打印转义后的sql语句 例子: from django.http import JsonResponse,HttpResponse from .m ...
- JavaScript之String总汇
一.常用属性 ·length:返回字符串中字符长度 let str = 'asd '; str.length = 1;//无法手动修改,只读 console.log(str.length);//4 二 ...
- protocol buffer c#
第一.打开vs中的Nuget
- 利用LOCK机制来定位前缀劫持者
一.文章信息 作者:Tongqing Qiu, Lusheng Ji, Dan Pei等 单位:佐治亚理工学院.美国电话电报公司实验室.康奈尔大学等 来源:Conference on Usenix S ...
- css-文字和图片在容器内垂直居中的简单方法
方法一.使用line-heigh使多行文字居中或图片居中 把文字包裹在一个inline-block元素中vertical-align middle,外部元素line-heigh等于高度 <div ...