裝載效率測試
測試頁面見:test/load-eff-test.html
為了測試結果更顯客觀,我選擇了第三方類庫的裝載測試:
'com.yahoo.yui.*',
'net.conio.prototype.*',
'net.fckeditor.*',
'org.jquery.*',
'us.aculo.script.*'
共22個腳本文件(對于JSI來說還有諾干包定義文件)。
FF2:
標記導入時間(原始方式):469,469,1047,484,484,437,469,484
同步導入時間:469,453,484,437,469,453
延遲導入時間:921,765,891,906,953,906,922
異步導入時間:859,1093,1141,1031,1641,1125,1078,1093,1157,1141
IE7:
標記導入時間:343,297,297,344,328,328
同步導入時間:281,250,235,235,234,234,250,265
延遲導入時間:922,422,406,391,391,391,407,391
異步導入時間:625,672,672,703,703,672,703,704,688
運行時間測試
測試腳本管理后對新能的影響,影響因素有:全局變量和局部變量的查找時間差異,eval的腳本和script標記直接插入的腳本的可能差異。(這
個測試不具有普遍性,這里我主要是測試了一下瀏覽器對局部變量的訪問速度【JSI里面訪問變量都是裝載單元內的局部變量】,所以故意測試了大量局部變量訪
問的操作)
測試頁面見:test/runtime-eff-test.html
FF2:
jsiTime: 845, 927, 598, 687, 764,
scriptTime: 1432, 950, 1305, 1278, 1219,
evalTime: 1644, 1373, 1322, 1186, 1360,
execTime: 0
dscriptTime: 1432, 950, 1305, 1278, 1219,
IE7:
jsiTime: 295, 205, 157, 315, 156, 142, 375, 328, 172, 172,
scriptTime: 172, 172, 189, 140, 251, 187, 217, 203, 172, 234,
evalTime: 236, 249, 139, 172, 281, 171, 172, 108, 436, 359,
execTime: 219, 234, 314, 157, 220, 266, 204, 234, 187, 95,
dscriptTime: 187, 265, 294, 326, 187, 328, 141, 221, 127, 249,
上面的基數太小,隨機誤差太大,調整原始數據從新測試一遍jsiTime和scriptTime
jsiTime: 576, 658, 688, 703, 611, 608,
scriptTime: 706, 608, 562, 547, 655, 657,
總結:
JSI的裝載性能表現不錯,完全不必計較。
托管代碼的運行性能也沒有太大區別,不過,因為。JSI托管腳本使用的變量基本都是裝載單元內的局部變量(本地聲明變量,或者外部依賴的引用或值拷貝),所以,對于FF這類局部變量比全局變量訪問速度快不少的解釋引擎,JSI托管腳本可以達到更好的運行效率。
有個奇怪的問題,JSI在裝載類庫時,與傳統模式相比,肯定增加了些額外的運算,但是,貌似JSI的同步裝載模式下,裝載腳本的耗時比傳統模式還少(IE 表現明顯)?為何?
歡迎大家對這奇怪的現象提出自己的猜想,我稍后貼出我對此問題的看法^_^
posted @
2007-06-22 15:01 金大為 閱讀(702) |
評論 (0) |
編輯 收藏
這次發布的JSI2Alpha相對于以前的預覽版本,做了一次全面的重構;同時對API做了些簡化。
目前JSI2的公開API有:
/* 導入函數 */
$import(<string>path,<boolean|Function>callbackOrLazyLoad[可選參數],<Object>target[可選參數])
/* 日志設置相關 */
$JSI.setDefaultLogLevel(level)
$JSI.setLogLevel(pathPattern,level)
/* 裝飾引擎相關函數 */
$JSI.addDecoratorProvider(pkg,alias…) //添加裝飾包.
$JSI.decorate ( ) //準備執行裝飾器任務,一般在配置文件(config.js)中調用.
/* 用于包定義的Package成員函數,在__package__.js中調用(this指向當前package對象) */
this.addScript(scriptPath,objectNames)//添加腳本及其聲明的對象(函數、方法名).
this.add*Dependence(thisPath,targetPath,beforeLoad)//添加腳本依賴.
this.setImplementation(realPackage)//設置具體實現包(當前包只是其別名,并無任何內容)。
我們會盡量將JSI做成與具體功能無關(專著于腳本管理)。
對于js.*.*這個類庫,做了些精簡。
只保留下列元素
#js.html //保留這個包,因為這些實在太常用了。
* BrowserInfo
* EventUtil
* StyleUtil
#js.util//保留這個包主要因為異步裝載用到這些類庫
* LoadTask
* Request
* ScriptLoadTask
* TaskQueue
發布文件說明:
自該版本啟,source目錄將不再打包。
但是在scripts目錄下新增boot-with-source.js文件,該文件中包含全部源代碼的數據。
里面編碼的源代碼可以通過我們的文檔工具查看。讓大家習慣一下這個工具的使用:)
JSA1beta:增加了對JSI2的編譯支持,同時對于普通腳本的壓縮,也增加了一些功能:
1. ant task 增加多文件分組合并。
2. swing ui 修正文件編碼的bug。
下載:
javaeye group: http://jsi.group.javaeye.com/shares
sourceforge: <系統最近好像有問題,我的文件一直沒能上傳成功,要過一段時間再說> 。。。。。
posted @
2007-06-22 14:36 金大為 閱讀(752) |
評論 (0) |
編輯 收藏
今天抽空測試了一下JSI當前狀態的瀏覽器兼容性,一個頭疼的問題困擾了很久。
找出問題出自,懷疑是一個opera的bug。
function test(x){
try{
if(x){
return 1;
}else{
return 2;
}
}catch(e){
x=1;
}finally{
x=2;
}
}
語法檢查就通不過,報告錯誤:
le://localhost/D:/eclipse/workspace/JSI/web/scripts/core.js
Event thread: BeforeExternalScript
opera8報錯,opera9好像就沒有這個問題。
貼出來,讓有類似問題的人省點心。
posted @
2007-06-20 21:42 金大為 閱讀(126) |
評論 (0) |
編輯 收藏
剛發布JSA的webstart版,順便吧這個古董級別的小程序也發布一下。
僅供那些和我一樣棋術平平的無聊人士打發時間。
高手就不必了:)
當能,如果是想找個地方出出氣,也可以,呵呵。
http://www.xidea.org/webstart/chess.jnlp
沒有棋譜,所以,開局的棋力很差。中局還行。
posted @
2007-06-14 10:51 金大為 閱讀(745) |
評論 (2) |
編輯 收藏
測試了一下trimpath模板引擎和一個我以前編寫xml模板引擎,顯示測試結果,828/16。
太讓我振奮了。原想,如果效率太低我就放棄這個項目,貌似結果:這個流行的js模板引擎,和我沒做優化的xml模板引擎還有這么大的差距???
仔細檢查一下,暈倒,測試模板數據搞錯了:(
糾正過來,測試數據顯示,trimpath比xml模板引擎要快好幾倍:(
而且,如果模板內使用的循環次數越多,差距越大:(
比較掃興的結果。
決定吧這個東西從jsi系統api中刪除。
不過,感覺,雖然有這點差距,xml模板引擎還是可以作為一個備用選擇。
基于js標記庫,類el表達式,對于熟悉jsp2.0,jstl的程序員來說,還是比較易懂,擴展也相對簡單(trimpath沒怎么研究,或許是錯的)。
下載測試:(XML Template是從jsi中拉出來的,部分測試中沒有用到的依賴沒有包括進去)
posted @
2007-06-08 16:15 金大為 閱讀(935) |
評論 (2) |
編輯 收藏
一直沒有找到好用的 javascript格式化工具,不過UE有個非常漂亮的功能,多行編輯,可以輕松的批量縮進。
但是eclipse呢?很遺憾,沒有,不過用正則表達式可以輕松完成這個功能,匹配整行,替換時在行前加上縮進空格。
find:^.*
replace With: $0
說到這個正則,鄙視一下js的正則語法,居然匹配組是 $1 $2 $3 ....索引從1開始,但是匹配全部為什么要來個$&? 多么難記??還是eclipse的$0方便
而且js的match函數返回的數組還是 [全匹配,組1,組2....],全匹配索引就是0嘛! 居然要來個$&??
扼殺我們的聯想天性。
posted @
2007-06-08 11:33 金大為 閱讀(735) |
評論 (0) |
編輯 收藏
今天和網友聊起在javascript里面實現DateFormat 的話題。
把想法發布一下,當是筆記。
格式化:
1、先用正則把日期表達式分段:
var tokens = "yyyy-MM-dd(沒有時間)".match(/y+|M+|d+|m+|[^yMdm]+/g)
//結果數組為:yyyy,-,MM,-,dd,(沒有時間)
2、將其中的yyyy MM dd 替換成相映的處理對象
3、格式化時,先復制數組,依次遍歷,如果元素是處理對象,那么元素值替換成處理結果。
4、將新數組join。即為需要結果。
5、parse時。先復制數組,若元素為字符串,精確匹配。若未處理對象,讀取需要的值,匹配失敗,則終止操作,返回結果。
想法而已,實際實現時可能還有很多現在無法意料的事情:)
posted @
2007-06-07 16:27 金大為 閱讀(1390) |
評論 (3) |
編輯 收藏
為了jsi2 alpha的盡快發布,我對jsi 的系統api重構了一下,刪除了一些不夠成熟或者沒有必要的api(將他們拖到org.xidea.* 命名空間下)。
更新(2007-6-9)
接上,移除了xml命名空間及其內容,裝飾引擎。io包并入util了,移除了一些腳本,如xml 模板引擎、裝飾引擎實現等。。。
基本上做到了功能無關了。
只剩下html包和util包。lang包這種語言兼容包不說。
現在的類庫只有(數據拷貝自JSI jsdoc):
#js.html //保留這個包,因為這些實在太常用了,
* BrowserInfo
//保留Decorator是因為裝飾器初始化,還是受到點特別關照
* Decorator
* EventUtil
* StyleUtil
#js.util//保留這個包主要因為異步裝載用到這些類庫
* LoadTask
* Request
* ScriptLoadTask
* TaskQueue
現在的類庫只有(數據拷貝自JSI jsdoc):
#js.html //保留這個包,因為這些實在太常用了,
* BrowserInfo
//保留Decorator是因為裝飾器初始化,還是受到點特別關照
* Decorator
* EventUtil
* StyleUtil
#js.util//保留這個包主要因為異步裝載用到這些類庫
* LoadTask
* Request
* ScriptLoadTask
* TaskQueue
歡迎大家提出自己的看法:)
posted @
2007-06-07 11:48 金大為 閱讀(748) |
評論 (12) |
編輯 收藏
JSI 自身提供一些常用API,數量極少,盡量以一種正式的風格提供,盡量回避爭議。
有些是啟動文件用到的,如任務隊列支持,還有如裝飾引擎直接用到的,如BrowserInfo、EventUtil、StyleUtil等。
對于啟動文件中未直接用到的,如果風格的爭議太大,都將剔除出去。
BrowserInfo對象:
/**
* BrowserInfo 對象,用于判斷瀏覽器的相關信息,如瀏覽器類型、quirks模式、客戶端語言(簡體中文?英語..未實現)、操作系統(未實現)等等。
* @public
*/
var BrowserInfo = {
isIE : falseChecker,
isOpera : falseChecker,
isGecko : falseChecker,
isNetscape : falseChecker,
isMozilla : falseChecker,
isFirefox : falseChecker,
isKhtml : falseChecker,
isSafari : falseChecker,
isKonqueror : falseChecker,
isQuirks : function(){…}
};
其中最常用的要數 is<瀏覽器類別>(最小版本號碼,最大版本號)。
此外,我還將BrowserInfo的函數拷貝到navigator對象上,這個有無必要呢?
//@Deprecated ???
for(var n in BrowserInfo){
window.navigator[n] = BrowserInfo[n];
}
不同之處:
現在在瀏覽器判斷上面,一般是用常量表示,比如isIE之類的,JSI的BrowserInfo使用函數,以便提供更強大更靈活的功能。
EventUtil
EventType 對象的成員函數有:
addListener(el, type, fn, cap)
removeListener(el, type, fn, cap)
add<Eventtype>Listener(element, listener, captrue)
如addLoadListener,addMousedownListener,addMouseoutListener
remove<Eventtype>Listener(element, listener, captrue)
createEvent(type, canBubble, cancelable)
dispatchEvent(el, even)
其中:
<Eventtype>代表一種事件類型。
W3C事件類型有:
var events = ['click','mousedown','mouseup','mouseover','mousemove','mouseout','load','unload','abort','error','select','change','submit','reset','focus','blur','resize','scroll'].
concat(['DOMFocusIn','DOMFocusOut','DOMActivate']);
此外,還添加了一種事件類型:DOMLoad。就是mozilla的DOMContentLoaded事件,在Dom樹構造完成但圖片資源等可能未完成時觸發。
對于這種事件類型, element, captrue參數都將忽略。暫時只有添加函數,沒有刪除函數(有刪除的必要嗎?)。
不同之處:
這個事件處理函數集與其他常見方式的卻別有:
- this支持。IE的attach方法添加的函數,運行時this指向window對象,JSI吧這點給糾正過來,與w3c的addEventListener行為一致。
- 事件類型直接體現在函數名中,這樣有利于書寫上的錯誤及早發現。
- 事件格式化,將事件的訪問方式格式化為W3C的方式。
- 自動清理,這也不算不同吧,現在大多數JS庫都提供這個功能,就是在離開頁面時清理全部注冊事件。但是這對一些單頁程序是無效的(OPOA,本人也比較討厭這種模式,呵呵),以后是否可以提供一個purgeElement函數,用于清理指定元素及其子元素的事件呢?
非常希望大家積極發表自己的看法,該修改就修改,如果爭議太大,那么我將吧這些從系統API中移除。
程序下載
這個API也可以脫離JSI使用,只是,在編寫的時候,因為有了JSI的保護,我使用了不少內部變量,為避免可能的沖突,做了如下處理。
var BrowserInfo = function(){
//#include(browser-info.js)
.
return BrowserInfo;
}
var EventUtil = function(){
//#include(event-util.js)
.
return EventUtil;
}
下載地址
posted @
2007-06-06 12:17 金大為 閱讀(729) |
評論 (0) |
編輯 收藏
QQ群里無聊的對話,貼出來:
小馬猴(53958317) 20:31:20
那二進制還中國發明的呢
五風樓客(63515213) 20:36:02
哦,二進制與中國什么關系,還真不知道呢,呵呵?
五風樓客(63515213) 20:36:23
那個朝代的事呢?
小馬猴(53958317) 20:35:43
據說是萊布尼茨在周易中發現了二進制
海闊天空(149788288) 20:35:46
我也孤陋寡聞了
小馬猴(53958317) 20:36:02
就是那個八卦圖
五風樓客(63515213) 20:37:04
^_^,強
五風樓客(63515213) 20:37:49
今天才知道,我們大中國計算機技術領先西方三千年:)
海闊天空(149788288) 20:37:16
是啊是啊,中國領先的多著呢
五風樓客(63515213) 20:38:09
不止,估計有個四千年左右把:)
呵呵
小馬猴(53958317) 20:37:22
不過外國人看周易,發明了計算機,中國人看周易,發明了算命。
小馬猴(53958317) 20:38:25
搜狐這兩天就請了幫看風水的人去看他總部呢。那些看風水的就是什么周易什么什么研究會的。
五風樓客(63515213) 20:39:20
找張八卦圖看看,能不能發現什么玄機呢:)
海闊天空(149788288) 20:38:56
八卦新聞
五風樓客(63515213) 20:40:08
不管什么新聞,俺是一直非常鄙視搜狐的。
小馬猴(53958317) 20:39:23
我估計八卦圖說不定是中國古代發明的圖靈機呢
小馬猴(53958317) 20:39:29
哈哈
Tu-160(382392596) 20:41:50
哈哈哈
海闊天空(149788288) 20:42:03
八卦是好東西啊,兩儀生四向,四向生八卦
海闊天空(149788288) 20:42:17
下面一句是什么來著
五風樓客(63515213) 20:44:06
太極生兩儀 兩儀生四向 四向生八卦 八卦生萬物
小馬猴(53958317) 20:43:49
嗯,于是萊布尼茨從這句話悟出了二進制
五風樓客(63515213) 20:45:19
呵呵,原來最早使用8進制的不是瑪雅人,是俺們先輩,呵呵
海闊天空(149788288) 20:44:34
確實有2進制的意思啊
海闊天空(149788288) 20:44:43
中國古代是用16進制吧?
五風樓客(63515213) 20:45:51
恩,至少重量單位是的
五風樓客(63515213) 20:46:23
小時候還經常聽老人們說16量的秤,呵呵
海闊天空(149788288) 20:47:05
一打
霖雨(3366414) 20:47:35
半斤八兩
posted @
2007-06-06 08:19 金大為 閱讀(226) |
評論 (2) |
編輯 收藏