JavaScript高性能开发的十条建议

JavaScript高性能开发的十条建议

文/开发部 Dimmacro

编者按:javascript开发大部分程序员都做过,写出来的代码质量也千差万别,现在浏览器内嵌的解释器虽然效率已经很高了,但在客户完美体验的趋势下还是捉襟见肘,编写高性能javascript代码,无疑能带来更好的客户体验。本文的这些建议能给开发者带来一定的方向指导,值得一读。

1.使用延迟脚本,动态加载脚本,XHR脚本注入等方式加载js脚本,避免多脚本加载出现的页面长时间等待。

编辑解读:每读取一个页面,页面内容从上到下顺序加载,每遇到js文件,UI线程暂停读取页面,下载并进入js文件中进行解析,如果js文件过多过大,往往导致暂停时间过长,延长了页面加载时间。因此采用上述技术,只将需要的js加载进来,待页面完全显示后,再加载其他js,提高客户体验。

2.用临时变量存储需要多次访问的全局对象及变量,减少在作用域链中解析标识符的时间。

编辑解读:js解释器查找变量的时候,从局部作用域链到全局作用域链,如果频繁的读取一个全局变量,将其用临时变量指代,无疑会提高读取效率和代码运行效率。

3.在JS脚本里尽可能多的对元素操作完成后一次运用到元素,避免多次读取相同的元素位置,大小,偏移量等信息,用变量存储之以减少UI线程重排,重绘元素的压力。也可以采用隐藏元素再修改,文档片段修改后一次加入,和克隆副本并在操作副本后将副本取代原对象的方式,尽量减少由于JS操作带来的多次UI刷新。

编辑解读:每次js脚本对html元素进行了修改,UI线程都会对整个页面进行重绘以更新页面,减少重绘次数,提高重绘和重排效率。

4.循环遍历多采用从后往前式,较少与length比较大小再判断true或false的步骤会提高很大的性能。if-else判断时将概率大的处理放在前面。for循环利用达夫设备模式一次多执行几次操作。

编辑解读:一般人遍历数组或列表都是从前往后遍历,此种遍历方式每次都是比较当前index是否大于数组长度减1,如果采用从后往前遍历,利用js中小于0都是false的特性,减少判断。达夫设备模式是一种思路,让一次循环尽量执行多的操作,从而提高效率。其基本思想是:先遍历总次数与8的取模次,然后遍历总次数除于8取整的次数,每次处理八个相同的操作。如:

// dafu

var
iters = Math.floor(arr.length/8);

var
startIn = arr.length%8;

start
= +new Date();

do{

switch(startIn){

case
0:process();

case
7:process();

case
6:process();

case
5:process();

case
4:process();

case
3:process();

case
2:process();

case
1:process();

}

startIn
= 0;

}while(--iters);

5.递归嵌套利用Memoization,缓存之前的计算结果以较少重复计算。

编辑解读:类似多次求阶乘问题,用此方式缓存之前阶乘结果,能有效避免重复计算,提高效率。示例代码:

function memoize(fundamental,cache){

cache
= cache || {};

var
shell = function(arg){

if(!cache.hasOwnProperty(arg)){

cache[arg]
= fundamental(arg);

}

return
cache[arg];

};

return
shell;

}

6.字符串连接多用+而不是+=,并且让连接字符串中最常的一个字符串放到等号后最左的位置,如 var
newStr=longStr+other1+other2....如果是IE7及更早版本,多用数组项连接来连接字符串。

编辑解读:IE7及更早版本,对字符串连接操作采取的是全部拷贝到一块新的内存后连接在一起的方式,特别耗性能,不过随着软硬件的升级,IE7及更早版本已经要退出历史舞台了。新的IE8,9对字符串连接都做了不少优化。

7.明确正则表达式的起始匹配位置,尽量减少匹配分支,合适使用匹配量词,避免回溯混乱产生的性能问题。

编辑解读:正则匹配,每一个模糊或元字符都是一个分支,在每个分支匹配的最后,如果没有成功结果,会退回到上一个分支,因此,减少匹配分支能有效提高匹配的效率。

8.使用定时器setTimeout和setInterval将需要耗时很长的js脚本分段处理,可以避免出现页面假死现象。

编辑解读:JS解释执行与页面渲染共用一个UI线程,因此如果JS代码占用线程时间过长,必然会影响页面渲染从而造成假死的现象。解决的方式就是利用定时器函数,分开整段js代码执行,分段利用CPU,让页面渲染能有更多的机会抢到执行时间。

9.多使用浏览器支持的原生方法,而不是自己实现的方法。

编辑解读:原生的方法,现代浏览器都做了一些优化。如IE8以后对查询实现了querySelector和querySelectorAll方法,比jquery更高效,使用更方便。

10.利用脚本预处理技术,javascript压缩技术,多个脚本合并技术等,尽量减少浏览器加载时的HTTP请求次数和跳过空白和注释的次数。

编辑解读:页面加载的时候对每一个js文件都会执行一次http请求,以便将js文件的内容读入并解析,采用上述技术,可以减少http请求的次数,提高解释器解析的效率。

来自为知笔记(Wiz)

时间: 2024-10-10 01:02:01

JavaScript高性能开发的十条建议的相关文章

原 .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)

大家都说反射耗性能,但是到底有多耗性能,哪些反射方法更耗性能:这些问题却没有统一的描述. 本文将用数据说明反射各个方法和替代方法的性能差异,并提供一些反射代码的编写建议.为了解决反射的性能问题,你可以遵循本文采用的各种方案. 本文内容 反射各方法的性能数据 反射的高性能开发建议 创建类型的实例 反射获取 Attribute 反射调用公共 / 私有方法 使用预编译框架 附本文性能测试所用的代码 所有反射相关方法 IsDefined 和 GetCustomAttribute 的专项比较 参考资料 反

ios开发——实用技术篇&开发总结余建议

iOS应用性能调优的25个建议和技巧 我要给出的建议将分为三个不同的等级: 入门级. 中级和进阶级: 入门级(这是些你一定会经常用在你app开发中的建议) 1. 用ARC管理内存 2. 在正确的地方使用reuseIdentifier 3. 尽可能使Views不透明 4. 避免庞大的XIB 5. 不要block主线程 6. 在Image Views中调整图片大小 7. 选择正确的Collection 8. 打开gzip压缩 中级(这些是你可能在一些相对复杂情况下可能用到的) 9. 重用和延迟加载V

Java Web高性能开发(三)

今日要闻: Clarifai:可识别视频中物体 最近几年,得益于深度学习技术的发展,谷歌和Facebook等企业的研究人员在图形识别软件领域取得了重大突破.现在,一家名为Clarifai的创业公司则提供了一项新服务,利用深度学习技术来理解视频内容. 深度学习需要借助一个模拟"神经元"的网络来处理数据,并且利用实例数据对其进行训练.Clarifai的技术源自纽约大学的研究,该公司2013年在一项著名的图片内容识别软件竞赛中取得前五名. 今日英文: http://docs.oracle.c

给Javascript初学者的一点小建议

本文来自e良师益友网 一般初学JavaScript的时候最头痛的就是浏览器兼容问题.在Firefox下面好好的代码放到IE就不能显示了,又或者是在IE能正常显示的代码在firefox又报错了. 如果你正初学JavaScript并有着一样的处境的话建议你:初学JavaScript的时候无视DOM和BOM的兼容性,将更多的时间花在 了解语言本身(ECMAScript).只在特定浏览器编写代码(Chrome/Firefox/Safari),实际工作中使用成熟的 JavaScript框架(jQuery等

改善JavaScript程序的188个建议

前言第1章 JavaScript语言基础建议1:警惕Unicode乱码建议2:正确辨析JavaScript句法中的词.句和段建议3:少全局变量污染建议4:注意JavaScript数据类型的特殊性 建议5:防止JavaScript自动插入分号建议6:正确处理JavaScript特殊值建议7:小心保留字的误用建议8:谨慎使用运算符建议9:不要信任hasOwnProperty建议:谨记对象空特性建议11:慎重使用伪数组建议12:避免使用with建议13:养成优化表达式的思维方式建议14:不要滥用eva

《编写高质量代码:改善JavaScript程序的188个建议》学习小记(一)

作者介绍: 成林,资深Web前端工程师,从事Web前端工作多年,精通CSS.HTML.JavaScript.jQuery和Ajax等Web前端技术,在实践中积累了大量的经验.推崇Web技术标准,曾经在多所高等院校和一些线下技术沙龙主讲Web标准和规范相关的课程,曾经还参与过W3C组织的标准化文档的中文编译工作.近几年来,集中精力研究和实践CSS3和 HTML 5前沿技术,在国内是该领域的先驱者之一. 其中书的目录分类为以下几部分: 第1章 JavaScript语言基础 第2章 字符串.正则表达式

Android开发的十个建议

尽管现在Android智能手机和平板电脑的运行的速率越来越快,但开发者仍需牢记,应用的运行环境仍受到电池和处理器等诸多资源的限制.以下是如何为应用“瘦身”的十条建议,以便能在当前和以后的所有Android设备都能运行出最佳效果. 1) 首先要有良好的编码习惯   一个优秀的开发者应该善于运用知识.完善的算法和标准设计模式.要有资源意识,打开了就要记得关闭,尽量做到晚获取.早释放.这些由来已久的编码准则同样适用Android应用开发,尤其是使用基础设备服务时. 2) 让阻塞操作原理UI线程   通

JavaScript 应用开发 #1:理解模型与集合

在 < Backbone 应用实例 > 这个课程里面,我们会一起用 JavaScript 做一个小应用,它可以管理任务列表,应用可以创建新任务,编辑还有删除任务等等.这个实例非常好的演示了使用 JavaScript 来开发富应用,它也能让你对 JavaScript 有一个更好的理解.所以,我们接下来会分成几天,把这个小应用的功能,分成几个部分,介绍每个小功能的细节.跟着这篇文章,或者 < Backbone 应用实例 > 这个课程,动手练习一下.效果会非常好. 在文章里面,我会把需要

JavaScript 面向对象开发知识基础总结

JavaScript 面向对象开发知识基础总结 最近看了两本书,书中有些内容对自己还是很新的,有些内容是之前自己理解不够深的,所以拿出来总结一下,这两本书的名字如下: JavaScript 面向对象精要 JavaScript 启示录 如果对于 JavaScript 面向对象编程理解不够深的话,第一本书还是强烈推荐的.第二本书比较适合初中级的开发者阅读.对各种知识点都有代码示例.内容中规中矩. 1.JavaScript 中的变量类型和类型检测 C#和Java等编程语言用栈存储原始类型,用堆存储引用