打印

[原创]也谈javascript程序优化问题

写了几年代码,很少谈到javascript程序的执行效率问题,今天就举几个例子看看,让大家看看程序优化是多么重要。
这节来看看createElement和innerHTML的表现。看看差别是多大
createElement:

 提示:您可以先修改部分代码再运行
innerHTML:

 提示:您可以先修改部分代码再运行

第二讲:同样是createNode,再来看看执行顺序的差别

先创建子节点,再append到父节点

 提示:您可以先修改部分代码再运行
先append到父节点,再创建子节点

 提示:您可以先修改部分代码再运行
[ 本帖最后由 cityvoice 于 2007-2-5 10:20 编辑 ]
关于innerHTML...

 提示:您可以先修改部分代码再运行
保存成文件再测试速度...在线测试速度和保存成文件测试速度似乎差别很大-.-(在线测试速度innerHTML非常之慢...但是保存成文件之后..innerHTML反而更快.)

cityvoice:你的innerHTML不应该不停地加,而应该一次性赋值,减少系统解析代码的时间.

[ 本帖最后由 Sheneyan 于 2007-2-5 10:49 编辑 ]
子叶:子乌的叶子
帅哥们,美女们,新的一年终于来了,祝贺你们...终于又老了一岁~
关于appendChild的先后,其实是牵涉到ie如何为你的代码分配内存的问题.

可以参考这篇关于javascript 内存溢出的文章:
http://www.blogjava.net/tim-wu/archive/2006/05/29/48729.html
子叶:子乌的叶子
帅哥们,美女们,新的一年终于来了,祝贺你们...终于又老了一岁~

TOP

还在为头像烦恼?还在为不能关注好友动态烦忧?快来蓝色理想家园吧!

不对吧,即使保存成文件之后,innerHTML也会慢很多

如果是ie用innerText倒是比较块,你说的一次行插入也有问题,也会比较慢,拼接字符串需要花费大量时间,除非你愿意把所有字符串写在一行,那我就没话说了。

TOP

如果要插入innerHTML的字符串需要拼接多次,可以用数组来做StringBuffer
var str=[];
str.push("……")
……
div.innerHTML=str.join("");
不过str拼接在字符串数量比较少的时候性能 没什么差别,基本上感觉不到拼接时间

TOP

......一群怪人
http://music.17kk.net/

TOP

引用:
原帖由 kamildor 于 2007-2-5 11:35 发表
如果要插入innerHTML的字符串需要拼接多次,可以用数组来做StringBuffer
var str=[];
str.push("……")
……
div.innerHTML=str.join("");
不过str拼接在字符串数量比较少的时候性能  ...
没实际测试过拼接字符串的效率,不过感觉用数组应该更慢吧?

TOP

引用:
原帖由 davidnick 于 2007-2-5 13:25 发表

没实际测试过拼接字符串的效率,不过感觉用数组应该更慢吧?
数组的join方法是内部方法,速度会比用js写的代码调用速度快,
不过在FIREFOX下拼接和用数组就没什么区别了

[ 本帖最后由 kamildor 于 2007-2-5 16:05 编辑 ]

TOP

第三讲,尽量用cloneNode代替createNode

还是看例子
用cloneNode

 提示:您可以先修改部分代码再运行
用createNode

 提示:您可以先修改部分代码再运行

TOP

其实JS优化并只是你说的那些

JS优化包括很多方面,例如减少创建对象的数量,有必要根据实际情况来决定采用哪种策略,有的时候每次调用都去查找对象会比将全部对象缓存更加适合,一个比较明显的例子,当对象数目过多时会导致IE崩溃,在这种况下不去缓存对象是比较正确的做法。所以说不能一味的从技术角度考虑问题。
很多在技术上看来会提高速度的东西,在实际应用中有时候是会造成问题的。

[ 本帖最后由 darkktt 于 2007-2-6 09:30 编辑 ]

TOP

回复 #11 darkktt 的帖子

呵呵,如何在时间(执行效率)和空间(内存占用)上取得一个合适的比例点,这是一个值得研究的问题。

也许有人会觉得js性能不高并不会有太大的影响,象楼主那样,也要把程序重复个100遍才会看出效果。这种想法大大的不好。。每个地方延缓个200-300ms,一个稍微大型的项目,js的代码量都会达到百k级,各个点性能的降低会严重影响整个项目的运行。。最近是深有体会-。-

to darkktt:不过使用对象缓存池就能减轻你所说的这种由于对象太多引起的crash
子叶:子乌的叶子
帅哥们,美女们,新的一年终于来了,祝贺你们...终于又老了一岁~

TOP

事实上使用JS的时候问题很多,比如说我正在使用的xforms,目前还没有比较好的浏览器支持(FF支持但是效果不好),所以用JS来模拟,直接后果是会使用大量的 JS,而我们又使用portlet,你想象一下,一个页面会打开3-4个portlet,每个portlet都加载300-400K的JS,同时portlet框架(我们用的是lifery)还有100-200K的JS,上面的3-4个是保守估计,so...。我整天都快被这些东西搞疯了。

TOP

不止上面的问题,每个portlet页面都很复杂,要么是几百个input(都带有自己的行为),要么是带10几个模拟控件。狂faint中......555

TOP

楼上说得没错

其实,做程序就是这样,不能一味强调某一方面,有时候我们在获得某一项便利特性得同时比如PORTAL技术,就不得不牺牲另外一些特性,我们要做的就是要尽量平衡各方面得要求。不改变其它性能的情况下,我们应该尽量去优化已有代码,这在大型项目得时候尤其重要,这是做一个好的程序员所应具备得。

TOP

如果是大型项目的话,用现成的framework之前一定要先精简,另外能用函数解决的问题就不要用对象。能用内部方法解决的问题尽量用内部方法。能够自己用少量代码解决的问题就不加载第三方的模块。对象缓存池也解决不了同时创建太多对象的问题。有时候要优先考虑面向过程的设计思路。
[Bound0 专题列表]QUE SAIS-JE?
生物信息技术支持动漫论坛动漫分享群:45274013

TOP