YUI 3.0 Preview Release 1 推出了,並且是砍掉重練式的大更新,所以我當然要來測一下它的 Selector 速度囉!由於取用方式與其他 Library 有很大的不同,我花了一點時間才成功將它放進 SlickSpeed。
目前 YUI 官方給的範例、文件中都是採用這樣的方式
YUI().use('node', function(Y) {
Y.get('#demo').addClass('enabled');
});
yui-min.js 是一個 Loader ,使用時必須先用 YUI.use() 來建立 instance 並載入所需功能,然後才能使用 Y.get() 這種寫法。經過我研究原始碼後發現,如果只要用 Selector 的部份,則僅需載入 yui-base-min.js, dom-base-min.js 和 selector-min.js 三個檔案,然後使用 YUI().use("selector").Selector.query() ,就能選擇 HTML 物件。不過如果是載入 yui-min.js ,就不能用這種方法了。
測試結果:YUI 2 終於不再是最慢的 Selector ,因為現在多了 YUI 3 來當它的墊背… 囧rz
YUI 終於有了 Selector 套件,因此我又更新了我的 SlickSpeed 頁面,另外也順便把 base2, dojo, Ext JS, MooTools 都更新到最新版。由於現在 Library 數量已經太多,因此各 Library 我就只放最新版,不做新舊版本的比較。
Ext JS 在 Internet Explorer 7 中贏了 base2 ,但在 Firefox, Opera 中 base2 仍然大勝 Ext JS (其實跟上次的測試結果是一樣的)。 base2 目前的版本(1.0 beta 1)在 Safari/Win 中似乎有點問題,處理逗號時需要超久的時間(例如 div, div, div),因此 base2 在 Safari/Win 中就變成了最後一名,但若不看那幾個有問題的部份的話,它仍然是冠軍。以上四個瀏覽器都是 base2 和 Ext JS 在爭奪前兩名。
今天新增的成員 YUI Selector 的表現則不怎麼好看,在 Firefox, Opera 中它都是最後一名、在 Safari/Win 中為倒數第二名,在 Internet Explorer 7 中則是倒數第三名。
我今天發現在 Internet Explorer 7 中因為 Ext JS 出了個無關緊要的 Error ,卻導致 SlickSpeed 完全無法運作,才下定決心修好它。 Ext JS 2.0 應該有改寫一些地方,我測試到最後發現,竟然只要留下 Ext.DomQuery 這個 Class ,其他統統刪除就可以了,我記得之前在 2.0 alpha 1 時也這樣作過但是不行啊……
給心急的讀者們
/*@cc_on _d=document;eval('var document=_d')@*/
解說
因為 document 是 window 的子物件,對 IE 來說,要使用 document ,必須經過 window ,而上面的方法是讓 document 成為一個獨立的物件,不必透過 window ,因此速度就提昇了。
這個方法也適用於其他子物件,以下是完整的加速法:
/*@cc_on
eval((function(props) {
var code = [];
for (var i = 0, l = props.length;i<l;i++){
var prop = props[i];
window['_'+prop]=window[prop];
code.push(prop+'=_'+prop)
}
return 'var '+code.join(',');
})('document self top parent alert setInterval clearInterval setTimeout clearTimeout'.split(' ')));
@*/
但當然也只有使用到這些物件的時候效能會有所提昇,如果你的程式中用到這些物件的部份不多,便不會有這麼大的效果。
資料來源:一行で IE の JavaScript を高速化する方法
後記
根據這個原理,我想 Super_Long_Really_Annoying_Enormous_Class_Names(); 應該也會比 Super.Long.Really.Annoying.Enormous.Class.Names(); 更快吧! XD 寫 JavaScript 時要注意不要建立太多子物件……
更新了我的 SlickSpeed 測試頁,加入 Ext JS 和 jQuery 1.2.1 一起測試。理論上我應該拿掉 jQuery 1.1.3.1 的,但是目前會來這一頁的人大部份都是為了看 1.1.3.1 與 1.1.4 的差別,所以暫時先保留著。
我還滿期待這次新增的 Ext JS ,因為 Dean 跟 Jack 的關係好像不是很好…… XD 以下是我的測試結果: Ext JS 在 Firefox 表現普通;在 Safari 僅次於 base2 和 Prototype.js ,但在 Safari 中大家都很快,所以差距都不大;在 IE7 則小勝 base2 ,但在 IE6 又小輸給 base2 。
所以讓我失望了…… Dean 的衛冕者寶座仍無人能撼動。
因為好奇最近 jQuery 1.1.4 的更新提昇了多少速度,因此自己放了一個 SlickSpeed 測試頁。本來也想加入 Ext.js 一起測,不過加不成功,不知道 Ext.js 是不是有哪裡需要特殊設定?
下面是我的測試結果,我的電腦好像滿差的 XD
| |
Firefox2 |
Firefox3 |
IE 6 |
IE 7 |
Opera9 |
Safari3 |
| base2.DOM 0.9 (alpha) |
32 |
115 |
1600 |
395 |
128 |
52 |
| dojo 0.9.0 |
467* |
715* |
2711* |
821* |
229* |
286* |
| jQuery 1.1.3.1 |
757 |
872 |
3253 |
710 |
519 |
338 |
| jQuery 1.1.4 |
694 |
847 |
3911 |
914 |
436 |
278 |
| MooTools 1.2dev |
212* |
267* |
4926* |
1496* |
227* |
152* |
| prototype 1.5.1.1 |
203 |
282 |
6599* |
1833* |
219 |
80 |
| prototype 1.6.0_rc0 |
184 |
249 |
6436* |
1712* |
207 |
48 |
| * 發生錯誤或回傳結果為零 |
測試 Firefox 2 和 IE 7 的電腦配備較好,因此整體都比較快。
Update: 之前測試 dojo 在 IE 7 完全不能動可能是因為我用 Standalone 版本的緣故,更新為安裝版的重測結果。
看見謝老在玩 <canvas> ,因此引發我的興趣,於是就跟著也寫了一個產生星狀圖的程式——前八張圖的值是隨機的,後四張則是固定的。如果要挑 bug 的話,就是視窗改變大小後,圖形可能會換行,但數值的位置不會隨著圖形改變,要按重新整理才會更新。
Canvas 中畫弧的 method 使用的角度單位是弧度,因此要用三角函數計算,讓我複習了不少三角函數,過去學了不知道有什麼用的三角函數,終於在這次派上用場,看著 JavaScript 中充斥著數學計算式真是有成就感 XD
Canvas 沒有寫字的 method ,這一開始讓我覺得滿奇怪的。有些人是先建立一個暫時的 HTML 物件,再將其上的文字複製過來,但我後來覺得直接使用 HTML 物件就很好啦!我猜 Canvas 不內建寫字的 method 也是考慮到這點。
好久沒有像這樣不用管瀏覽器支援程度,寫沒有用的東西來玩了,感覺好舒暢啊!
※ Firefox 1.5 / Safari 1.3 / Opera 9 以上版本才支援 Canvas 。
jEditable 是一個 jQuery 的 In-Place Editor Plugin 。這次 jQuery 1.1 的更新,它也受到了影響。以下是需修改的部份:
Line 63:
if (jQuery(this).id() == null) {
if (jQuery(this).attr("id") == null) {
Line 212:
jQuery(self).load(settings.url, p, function(str) {
jQuery.post(settings.url, p, function(str) {
self.innerHTML = str;
其實還有其他的啦… 不過這樣已經能動了 :p