读高性能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 web 答辩总结
今天我们组答辩.在昨天前三个组答辩之后,整理了一些试题. 在这个项目的答辩准备:首先把这个java web这本书大概的看了一遍:对整理的那些试题也把答案整理出来了:针对老师提问频率较高的试题:针对自己 ...
- FormData序列化及file文件上传
表单数据上传 情况一: 一.当表单文件处于无任何处理状态时,用submit提交直接上传; 但这种方式上传,数据无任何处理:(极少使用): 但是传统的表单提交会导致页面刷新,但是有些情况下,我们并不希望 ...
- 常见移动设备的 CSS3 Media Query 整理(iPhone/iPad/Galaxy/HTC One etc.)
@charset "utf-8"; /** * iPhone 4/4s landscape & portrait */ @media only screen and (mi ...
- ASP.NET MVC提交一个较复杂对象至WCF Service
前一篇<jQuery.Ajax()执行WCF Service的方法>http://www.cnblogs.com/insus/p/3727875.html 我们有练习在asp.net mv ...
- ASP的不足与ASP.NET和ASP的区别
ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强.ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型.面向结构的编程语言,而非面向对象,这就明显 ...
- 面试之Mysql优化问题
一.前言 MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多的查 ...
- LOJ#505. 「LibreOJ β Round」ZQC 的游戏(最大流)
题意 题目链接 Sol 首先把第一个人能吃掉的食物删掉 然后对每个人预处理出能吃到的食物,直接限流跑最大流就行了 判断一下最后的最大流是否等于重量和 注意一个非常恶心的地方是需要把除1外所有人都吃不到 ...
- git基础使用——TortoiseGit
一.初识git Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制 ...
- 从零开始学习html(十二)CSS布局模型——下
五.什么是层模型? 什么是层布局模型?层布局模型就像是图像软件PhotoShop中非常流行的图层编辑功能一样, 每个图层能够精确定位操作,但在网页设计领域,由于网页大小的活动性,层布局没能受到热捧. ...
- C++调用IDL程序的做法(三)
作者:朱金灿 来源:http://blog.csdn.net/clever101 在C++调用IDL程序的做法(二)一文中介绍了如何动态创建IDLDrawWidgetControl的做法.假如我 ...