`
m635674608
  • 浏览: 5028563 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

js 优化

    博客分类:
  • js
 
阅读更多

在项目中。因为牵扯到两条数据的对比,一条数据有100多个字段。同事写了个对比方法,很慢需要几十秒。

后来调试了一下。发现性能出现在选择器查找上。后来优化了下,一次性取到内存中去对比,瞬间快了。

查了下js性能优化

转载:http://www.poluoluo.com/jzxy/201212/192355.html

本文提供即刻提升你的脚本性能的十个步骤。不用担心,这并不是什么高深的技巧。人人皆可运用!这些技巧包括:
使用最新版本
合并、最小化脚本
用for替代each
用ID替代class选择器
给选择器指定前后文
建立缓存
避免DOM操作
避免使用concat(),利用join()处理长字串
返回false值
利用小抄和参考文档
使用最新版本
jQuery一直处于不断的开发和改进过程中。 John 和他的团队不断研究着提升程序性能的新方法。
一点题外话,几个月前他还发布了Sizzle,一个据说能在Firefox中把程序性能提升3倍的JS选择器库。
如果你不想时刻关注是否有新版本,然后再花时间下载上传,Google 就又能帮你一把了。他们的服务器上存储了大量Ajax库供您选择。

. 代码如下:

<!-- 利用一个简单的script标签调用API -->
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
/* 加载 jQuery v1.3.2 */
google.load ("jquery", "1.3.2", {uncompressed: false});
/* 加载完成后弹出消息 */
function onLoad () {
alert ("jQuery + Google API!");
}
google.setOnLoadCallback (onLoad);
</script>


另一个更为简单快速的方法是直接使用脚本链接。如果要使用特定版本的jQuery,你可以使用上面的方法;如果想直接使用最新版,下面这句代码就够了:

. 代码如下:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script>


特定版本的还可以这样加载:

. 代码如下:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>


合并、最小化脚本
大部分浏览器都不能同时处理多个脚本文件,所以它们都是排队加载——加载时间也相应地延长了。
考虑到你网站的每个页面都会加载这些脚本,你应该考虑把它们放到单个文件中,然后利用压缩工具(比如 Dean Edwards 的这款)把它们最小化。更小的文件无疑将带来更快的加载速度。
JavaScript 和CSS压缩的目的是在保持脚本的执行性能的同时,减少数据传递的字节数(可以通过减小原始文件,也可以利用gzip。大多数产品级的网络服务器都把 gzip作为HTTP协议的一部分)。引自 YUI compressor,一款 jQuery官方推荐的压缩脚本的工具。
用for替代each
原生函数总是比辅助组件更快。
如果遇到需要遍历对象的情况(如从远程接收的JSON对象),你最好重写你的(JSON)对象为一个数组,数组的循环处理要容易些。
利用Firebug,我们能测定每个函数的执行时间。

. 代码如下:

var array = new Array ();
for (var i=0; i<10000; i++) {
array[i] = 0;
}
console.time('native'); //原生for函数
var l = array.length;
for (var i=0; i<10000; i++) {
}



上面的结果显示原生代码只需2毫秒就做到的事,利用jQuery的each方法需要26毫秒。而且这还只是我在本机上测试一个基本上啥也没做的函数的结果,当遇到更复杂的情况,例如设置css属性或DOM操作时,时间差异肯定更大。
用ID替代class选择器
利用ID选择对象要好得多,因为这时jQuery会使用浏览器的原生函数getElementByID()来获取对象,查询速度很快。
因此,比起利用那些方便的css选择技巧,使用更为复杂的选择器也是值得的(jQuery也为我们提供了复杂选择器)。你也可以手工书写自己的选择器(其实比你想象中简单),或者为你想要选择的元素指定一个有ID的容器。

. 代码如下:

//下例创建一个列表并且填充条目内容
//然后每个条目都被选择一次
//首先使用class选择
console.time('class');
var list = $('#list');
var items = '
';
for (i=0; i<1000; i++) {
items += '
item
';
}
items += '
';
list.html (items);
for (i=0; i<1000; i++) {
var s = $('.item' + i);
}
console.timeEnd('class');
//然后利用ID选择
console.time('id');
var list = $('#list');
var items = '
';
for (i=0; i<1000; i++) {
items += '
item
';
}
items += '
';
list.html (items);
for (i=0; i<1000; i++) {
var s = $('#item' + i);
}
console.timeEnd('id');


上面的例子很好地说明了不同选择方式之间的显著性能差异。请看下图,利用class来做选择,时间无限增大,甚至超过了五秒。
给选择器指定前后文
jQuery的参考文档里说:传递给jQuery() 原始DOM节点的前后文(如果没有东西被传递,则前后文为整个文档)。目的是连同选择器一起,实现更为准确的查询。
所以,如果你一定要利用class来指定目标,至少为选择器指定上下文,以免jQuery费精力去遍历整个DOM文档:
与其这样写:

. 代码如下:

$('.class').css ('color' '#123456');


为选择器加上前后文比较好(expression: 目标选择器;context: 前后文):

. 代码如下:

$(expression, context)


也就是说:

. 代码如下:

$('.class', '#class-container').css ('color', '#123456');


这样做要快得多,因为它不用遍历整个DOM。只要找到#class-container就好了。
建立缓存
不要犯不断重新选择同一个东西的错误。你应该把你要处理的元素缓存为一个变量。
更不要在一个循环里重复选择同一个元素!这样做十分影响速度!

. 代码如下:

$('#item').css('color', '#123456');
$('#item').html('hello');
$('#item').css('background-color', '#ffffff');
// 这样写更好
$('#item').css('color', '#123456').html('hello').css('background-color', '#ffffff');
// 甚至这样
var item = $('#item');
item.css('color', '#123456');
item.html('hello');
item.css('background-color', '#ffffff');
// 遇到循环,这样做非常不好
console.time('no cache');
for (var i=0; i<1000; i++) {
$('#list').append(i);
}
console.timeEnd('no cache');
// 下面这样要好得多
console.time('cache');
var item = $('#list');
for (var i=0; i<1000; i++) {
item.append (i);
}
console.timeEnd('cache');


避免DOM操作
DOM操作应该越少越好,因为诸如prepend(),append(),after()的插入动作都很费时。上面的例子如果用html()会更快:

. 代码如下:

var list = '';
for (var i=0; i<1000; i++) {
list += '
'+i+'
';
}
('#list').html (list);


避免使用concat(),利用join()处理长字串
听起来可能挺奇怪,不过这样做真的能提升速度,尤其是当连接特别长的字串时。先建立一个数组,放入你想要串联的东西。join()方法比字符串的concat()函数要快得多。

. 代码如下:

var array = [];
for (var i=0; i< =10000; i++) {
array[i] = '
'+i+'';
}
$('#list').html(array.join (''));


“ += 操作符更快——比把字串片段放到数组中然后join起来还要快”,“作为字串缓冲(string buffer)的数组在大部分浏览器中都比string.prototype.concat.apply方法效率更高,Windows下的Firefox 2.0.0.14例外。” — Tom Trenka
返回false值
您可能已经注意到,如果函数执行后不返回false,你就会被跳转到页面顶部。如果页面较长,这种反应是很烦人的。
所以,与其这样:

. 代码如下:

$('#item').click (function () {
// stuff here
});


不如多加一句:

. 代码如下:

$('#item').click (function () {
// stuff here
return false;
});


额外小贴士 – 小抄和参考文档

这条建议并不直接提升函数的执行速度,不过如果你肯花时间在这上面,研究研究这些小抄和参考文档,你将来定能节约很多时间。
请在手边随时放一张小抄以作快速参考。

分享到:
评论

相关推荐

    JS优化_淘宝网.pdf

    标题“JS优化_淘宝网.pdf”和描述“JS优化_淘宝网...但从上述的点可以看出,淘宝网在进行JavaScript优化时可能会考虑上述多方面的技术和方法。通过综合运用这些技术手段,可以极大程度上提升网站的加载速度和用户体验。

    javascript优化

    JavaScript 优化 JavaScript 作为一种脚本语言,广泛应用于 web 开发中,然而随着项目的复杂度增加,JavaScript 代码的性能问题不可忽视。因此,JavaScript 优化变得非常重要。本文将从多个方面对 JavaScript 优化...

    wangEditor.js优化版,实现wangEditor本地图片上传、wangEditor本地视频上传函数的构建,部分显示样式bug的调整

    wangEditor.js优化版,实现wangEditor本地图片上传、wangEditor本地视频上传函数的构建,部分显示样式bug的调整

    JavaScript优化.docx

    JavaScript优化是提升网页性能的关键步骤,尤其是在现代网页开发中,JavaScript的作用越来越大,但它对搜索引擎的友好性和页面加载速度都有直接影响。下面将详细讨论JavaScript优化的一些关键策略。 首先,...

    nodeJS优化js

    2. JavaScript优化:包括代码重构、消除冗余、算法优化等,旨在提高代码执行效率和加载速度。 3. UglifyJS:JavaScript压缩工具,能够混淆代码、删除空格和注释,减小文件大小。 4. 混淆代码:通过去除或加密汉字...

    js优化针对IE6.0起作用(详细整理)

    本文将详细讨论针对IE6.0起作用的js优化方法,包括字符串拼接、for循环优化、减少页面重绘、作用域链查找优化和避免双重解释等方面。 首先,关于字符串拼接的优化,原始的字符串拼接通常使用+=操作符,这种做法在...

    简单的成语小游戏js优化版

    这个优化版的游戏主要基于JavaScript(js)开发,因此,我们将深入探讨JavaScript在游戏开发中的应用,以及成语游戏可能涉及的编程技术。 JavaScript是一种广泛用于网页和网络应用的脚本语言,它在浏览器环境中执行...

    threejs性能优化与GPU优化.md

    threejs性能优化与GPU优化

    JavaScript优化方法.doc

    JavaScript 优化方法 本文将详细讲解 JavaScript 优化方法,以提高网站性能。作为一名网站开发 Web 前端工程师,对自己开发的网站项目应该尽可能地对其性能进行优化。本文将着重分析 JavaScript 的优化细节。 一、...

    js日历控件优化

    "js日历控件优化"的焦点在于提升用户体验、性能以及兼容性,使其更易用且适应不同场景。这里我们将深入探讨如何优化JavaScript日历控件,特别是那些包含时分秒选择,以及支持年月日显示的组件。 1. **性能优化**:...

    html5.js代码优化

    html5.js 代码优化

    js+sql优化处理

    首先,JavaScript优化主要包括以下几个方面: 1. **代码重构**:通过减少冗余代码,提高代码可读性和可维护性,避免不必要的计算和DOM操作。 2. **缓存利用**:使用变量存储重复计算的结果,或者利用浏览器缓存机制...

    JS性能优化框架

    标题:JS性能优化框架 描述:本文将深入探讨三种高效的JS框架,旨在通过采用先进的技术和策略来提升网页应用的性能。这些框架不仅能够优化资源加载流程,还能够改善代码执行效率,从而为用户提供更流畅、更快捷的...

    js lazyLoad 图片懒加载demo

    JavaScript(简称JS)是一种广泛用于网页和网络应用的编程...总的来说,这个项目是一个很好的学习和实践JavaScript懒加载技术的例子,通过它,你可以了解到如何有效地利用JavaScript优化网页性能,提高用户浏览体验。

    高效前端:Web高效编程与优化实践_机械工业出版社; 第1版 (2018年1月1日) 完整版-未加密

    全书共7章,内容从逻辑上大致可以分为两大类:第一类,偏向实践,围绕HTML、CSS、JavaScript等传统前端技术,以及PWA等新兴前端技术,讲解如何进行HTML优化、CSS优化、JavaScript优化、页面优化等,以此帮助前端...

    js css 优化软件

    在IT行业中,优化JavaScript(js)和CSS(css)是提升网页性能的关键步骤。这两个文件类型对于网页的呈现和交互性至关重要,但未优化的代码可能会导致加载速度慢,影响用户体验。下面,我们将深入探讨js和css优化的...

    JavaScript检查器和优化器.zip

    例如,Google的Closure Compiler是一个著名的JavaScript优化器,它将源代码转化为更高效的等效版本。Closure Compiler有三个编译级别:简单优化(SIMPLE)、高级优化(ADVANCED)和Whitespace Only,其中高级优化能...

    用 JS 编写的粒子群优化库_JavaScript_代码_下载

    用 JS 编写的粒子群优化库。适用于RequireJS,来自WebWorker,在node.js或普通浏览器环境中。 示例应用程序 simple优化一维函数的简单应用程序 simple-require和simple一样,除了使用 RequireJS simple-node一个...

Global site tag (gtag.js) - Google Analytics