YUI3 DOM Manipulation Performance Test
测试场景:给 table 的 150 个 tr 添加style="color: #ccc", 重复 20 次。
测试页面:dom-manipulation.html
点击每个测试按钮前,都重新启动浏览器。手工记录 10 * 4 * 4 次无明显偏差的数据,取平均值,可得到以下统计结果:

其它 DOM 操作结果类似。
结论:当页面较复杂,DOM 操作较多时,YUI3 会明显增加脚本执行时间,存在性能隐患。
原因分析
测试代码:
// jQuery 1.4
$("#test-table tr").css("color", "#ccc");
// YUI 3
Y.all("#test-table tr").setStyle("color", "#ccc");
用 Firebug 跟踪调用:
jQuery 基本调用链为:Sizzle – access(让 collection 有 css 方法) – css.
YUI 3 的调用链更复杂,甚至出现了 docHeight() 方法的调用。阅读源码可推测基本调用链为:Query – NodeList – Node – setStyle.
可以看出执行性能有三个方面:选择器性能、内部调用过程 和 setStyle 原子操作性能。
对于选择器来说,简单如#test-table tr, 经测试两者相差很小。
纯 setStyle 操作,两者也差不多。
可以判断:性能差异来自内部调用过程的设计。
思考
YUI3 的整体设计很漂亮,体现了 scalable(可大可小,能适用于小型站点也能搭建大型复杂应用) 的愿景。但这个 scalable 特性,目前看起来,仅体现在代码的模块组织以及灵活的组件加载和沙箱机制上。对于代码功能本身来说,YUI3 是个庞然大物。简单的功能,也需要历经设计优雅但执行漫长的内部调用过程。
感觉 YUI3 实际走向的是 ExtJS 路线。对于小型站点和快速应用来说,还是 jQuery 和 YUI2 好使。

January 10th, 2010 on 17:24
YUI3用起来感觉很麻烦,程序基本上是不能放在本地了,那样要每次都为base指定YUI目录相对当前页面的路径,很麻烦。分成那么多小模块,还必须得用combo,否则http请求过多。可能确实大型网站才可能会用到吧,看来学习它的源码就行了
YUI2.8性能比JQuery1.4还好?小型站点还是首选jquery,省事省心
January 10th, 2010 on 18:27
yui3适于团队开发和批量生产,这是他最大的优势,在性能上也必然会做出让步,这也是权衡的结果,若干年前c和java之间的某种纠结恩怨也源于此,性能or团队。
January 10th, 2010 on 19:09
有些意外。之前本地装slickspeed测选择器的效率yui3相当不俗。见 http://hikejun.com/demo/slickspeed/ 用taskspeed测dom操作比jquery是差一些,跟其它比还好,见 http://hikejun.com/demo/taskspeed/
January 10th, 2010 on 20:17
@kejun: slickspeed 和 taskspeed 测的是 css selector 和 dom 操作的性能,没有测试从 selector 到 dom 操作之间的“内部调用过程”。YUI 3 的内部调用过程有些漫长,影响性能。
January 10th, 2010 on 22:46
其实taskspeed的测试用例跟你的意思是一样的,比如“table”任务是创建40个table,每个再动态加个td,dom操作也算挺多的。所以“YUI3 会明显增加脚本执行时间,存在性能隐患”这句说的有点重了。YUI 3 的内部调用相对是多但还没糟糕到特别差的程度。
January 11th, 2010 on 11:36
@kejun: 感谢指正。看了下 taskspeed 源码,测试思路很不错。但 yui-tests.js 大量使用 Selector, 和实际使用 YUI 2 的情况不符(一般仅用 yahoo-dom-event, get, anim 等 utilities)。修改了一下:http://lifesinger.org/labs/taskspeed/
January 22nd, 2010 on 18:13
hi lifesinger,
你的chart图非常漂亮,是用什么工具生成的?
能否介绍一下? 谢谢!
leave a reply