隨筆-57  評論-129  文章-0  trackbacks-0
           

          裝載效率測試
          測試頁面見:test/load-eff-test.html

          為了測試結(jié)果更顯客觀,我選擇了第三方類庫的裝載測試:
          'com.yahoo.yui.*',
          'net.conio.prototype.*',
          'net.fckeditor.*',
          'org.jquery.*',
          'us.aculo.script.*'
          共22個腳本文件(對于JSI來說還有諾干包定義文件)。

          FF2:  
          標(biāo)記導(dǎo)入時間(原始方式):
          469,469,1047,484,484,437,469,484  
          同步導(dǎo)入時間:
          469,453,484,437,469,453  
          延遲導(dǎo)入時間:
          921,765,891,906,953,906,922  
          異步導(dǎo)入時間:
          859,1093,1141,1031,1641,1125,1078,1093,1157,1141  
            
          IE7:  
          標(biāo)記導(dǎo)入時間:
          343,297,297,344,328,328  
          同步導(dǎo)入時間:
          281,250,235,235,234,234,250,265  
          延遲導(dǎo)入時間:
          922,422,406,391,391,391,407,391  
          異步導(dǎo)入時間:
          625,672,672,703,703,672,703,704,688  



          運行時間測試
          測試腳本管理后對新能的影響,影響因素有:全局變量和局部變量的查找時間差異,eval的腳本和script標(biāo)記直接插入的腳本的可能差異。(這 個測試不具有普遍性,這里我主要是測試了一下瀏覽器對局部變量的訪問速度【JSI里面訪問變量都是裝載單元內(nèi)的局部變量】,所以故意測試了大量局部變量訪 問的操作)
          測試頁面見: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,       



          上面的基數(shù)太小,隨機誤差太大,調(diào)整原始數(shù)據(jù)從新測試一遍jsiTime和scriptTime

          jsiTime:    576,    658,    688,    703,    611,    608,          
          scriptTime: 
          706,    608,    562,    547,    655,    657,    


          總結(jié):

          JSI的裝載性能表現(xiàn)不錯,完全不必計較。
          托管代碼的運行性能也沒有太大區(qū)別,不過,因為。JSI托管腳本使用的變量基本都是裝載單元內(nèi)的局部變量(本地聲明變量,或者外部依賴的引用或值拷貝),所以,對于FF這類局部變量比全局變量訪問速度快不少的解釋引擎,JSI托管腳本可以達(dá)到更好的運行效率。

          有個奇怪的問題,JSI在裝載類庫時,與傳統(tǒng)模式相比,肯定增加了些額外的運算,但是,貌似JSI的同步裝載模式下,裝載腳本的耗時比傳統(tǒng)模式還少(IE 表現(xiàn)明顯)?為何?
          歡迎大家對這奇怪的現(xiàn)象提出自己的猜想,我稍后貼出我對此問題的看法^_^

          posted @ 2007-06-22 15:01 金大為 閱讀(708) | 評論 (0)編輯 收藏

           

          JSI簡介:

          JSI 是一個 開放的、無侵入的 腳本庫管理框架,內(nèi)核不提供任何具體功能,有一些功能子項目,如網(wǎng)頁裝飾引擎。

          更多信息請查看:http://www.xidea.org/project/jsi/


          JSA簡介:
          JSA最初是做JSI編譯處理的一個小工具,現(xiàn)在也可以用來混淆、壓縮腳本。支持swing和ant task兩種工作方式。
          可以通過webstart啟動:啟動JSA(允許訪問文件系統(tǒng))沙箱內(nèi)運行(功能受限)




          這次發(fā)布的JSI2Alpha相對于以前的預(yù)覽版本,做了一次全面的重構(gòu);同時對API做了些簡化。

          目前JSI2的公開API有:


          /* 導(dǎo)入函數(shù) */  
          $import(
          <string>path,<boolean|Function>callbackOrLazyLoad[可選參數(shù)],<Object>target[可選參數(shù)])  
            
          /* 日志設(shè)置相關(guān) */  
          $JSI.setDefaultLogLevel(level)  
          $JSI.setLogLevel(pathPattern,level)  
            
          /* 裝飾引擎相關(guān)函數(shù) */  
          $JSI.addDecoratorProvider(pkg,alias…) 
          //添加裝飾包.  
          $JSI.decorate ( ) //準(zhǔn)備執(zhí)行裝飾器任務(wù),一般在配置文件(config.js)中調(diào)用.   
            
          /* 用于包定義的Package成員函數(shù),在__package__.js中調(diào)用(this指向當(dāng)前package對象) */  
          this.addScript(scriptPath,objectNames)//添加腳本及其聲明的對象(函數(shù)、方法名).   
          this.add*Dependence(thisPath,targetPath,beforeLoad)//添加腳本依賴.  
          this.setImplementation(realPackage)//設(shè)置具體實現(xiàn)包(當(dāng)前包只是其別名,并無任何內(nèi)容)。 

           


          我們會盡量將JSI做成與具體功能無關(guān)(專著于腳本管理)。

          對于js.*.*這個類庫,做了些精簡。
          只保留下列元素

           

          #js.html //保留這個包,因為這些實在太常用了。  
             * BrowserInfo  
             
          * EventUtil  
             
          * StyleUtil  
            
          #js.util
          //保留這個包主要因為異步裝載用到這些類庫  
             * LoadTask  
             
          * Request  
             
          * ScriptLoadTask  
             
          * TaskQueue  

           

          發(fā)布文件說明:
          自該版本啟,source目錄將不再打包。
          但是在scripts目錄下新增boot-with-source.js文件,該文件中包含全部源代碼的數(shù)據(jù)。
          里面編碼的源代碼可以通過我們的文檔工具查看。讓大家習(xí)慣一下這個工具的使用:)

          JSA1beta:增加了對JSI2的編譯支持,同時對于普通腳本的壓縮,也增加了一些功能:
          1. ant task 增加多文件分組合并。
          2. swing ui 修正文件編碼的bug。

          下載:
          javaeye group: http://jsi.group.javaeye.com/shares
          sourceforge: <系統(tǒng)最近好像有問題,我的文件一直沒能上傳成功,要過一段時間再說> 。。。。。

          posted @ 2007-06-22 14:36 金大為 閱讀(757) | 評論 (0)編輯 收藏
          今天抽空測試了一下JSI當(dāng)前狀態(tài)的瀏覽器兼容性,一個頭疼的問題困擾了很久。
          找出問題出自,懷疑是一個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 金大為 閱讀(132) | 評論 (0)編輯 收藏

          剛發(fā)布JSA的webstart版,順便吧這個古董級別的小程序也發(fā)布一下。
          僅供那些和我一樣棋術(shù)平平的無聊人士打發(fā)時間。

          高手就不必了:)
          當(dāng)能,如果是想找個地方出出氣,也可以,呵呵。


          http://www.xidea.org/webstart/chess.jnlp



          沒有棋譜,所以,開局的棋力很差。中局還行。

          posted @ 2007-06-14 10:51 金大為 閱讀(753) | 評論 (2)編輯 收藏
          測試了一下trimpath模板引擎和一個我以前編寫xml模板引擎,顯示測試結(jié)果,828/16。

          太讓我振奮了。原想,如果效率太低我就放棄這個項目,貌似結(jié)果:這個流行的js模板引擎,和我沒做優(yōu)化的xml模板引擎還有這么大的差距???

          仔細(xì)檢查一下,暈倒,測試模板數(shù)據(jù)搞錯了:(

          糾正過來,測試數(shù)據(jù)顯示,trimpath比xml模板引擎要快好幾倍:(

          而且,如果模板內(nèi)使用的循環(huán)次數(shù)越多,差距越大:(

          比較掃興的結(jié)果。
          決定吧這個東西從jsi系統(tǒng)api中刪除。

          不過,感覺,雖然有這點差距,xml模板引擎還是可以作為一個備用選擇。
          基于js標(biāo)記庫,類el表達(dá)式,對于熟悉jsp2.0,jstl的程序員來說,還是比較易懂,擴(kuò)展也相對簡單(trimpath沒怎么研究,或許是錯的)。

          下載測試:
          (XML Template是從jsi中拉出來的,部分測試中沒有用到的依賴沒有包括進(jìn)去)

          posted @ 2007-06-08 16:15 金大為 閱讀(947) | 評論 (2)編輯 收藏
            一直沒有找到好用的 javascript格式化工具,不過UE有個非常漂亮的功能,多行編輯,可以輕松的批量縮進(jìn)。
            但是eclipse呢?很遺憾,沒有,不過用正則表達(dá)式可以輕松完成這個功能,匹配整行,替換時在行前加上縮進(jìn)空格。

          find:^.*
          replace With:  $0

          說到這個正則,鄙視一下js的正則語法,居然匹配組是 $1 $2 $3 ....索引從1開始,但是匹配全部為什么要來個$&?  多么難記??還是eclipse的$0方便
          而且js的match函數(shù)返回的數(shù)組還是 [全匹配,組1,組2....],全匹配索引就是0嘛! 居然要來個$&??
          扼殺我們的聯(lián)想天性。

          posted @ 2007-06-08 11:33 金大為 閱讀(741) | 評論 (0)編輯 收藏
          今天和網(wǎng)友聊起在javascript里面實現(xiàn)DateFormat 的話題。

          把想法發(fā)布一下,當(dāng)是筆記。

          格式化:
            1、先用正則把日期表達(dá)式分段:
              var tokens = "yyyy-MM-dd(沒有時間)".match(/y+|M+|d+|m+|[^yMdm]+/g)
              //結(jié)果數(shù)組為:yyyy,-,MM,-,dd,(沒有時間)
            2、將其中的yyyy MM dd 替換成相映的處理對象
           
            3、格式化時,先復(fù)制數(shù)組,依次遍歷,如果元素是處理對象,那么元素值替換成處理結(jié)果。

            4、將新數(shù)組join。即為需要結(jié)果。

            5、parse時。先復(fù)制數(shù)組,若元素為字符串,精確匹配。若未處理對象,讀取需要的值,匹配失敗,則終止操作,返回結(jié)果。




          想法而已,實際實現(xiàn)時可能還有很多現(xiàn)在無法意料的事情:)

          posted @ 2007-06-07 16:27 金大為 閱讀(1395) | 評論 (3)編輯 收藏
          為了jsi2 alpha的盡快發(fā)布,我對jsi 的系統(tǒng)api重構(gòu)了一下,刪除了一些不夠成熟或者沒有必要的api(將他們拖到org.xidea.* 命名空間下)。


          更新(2007-6-9)
          接上,移除了xml命名空間及其內(nèi)容,裝飾引擎。io包并入util了,移除了一些腳本,如xml 模板引擎、裝飾引擎實現(xiàn)等。。。
          基本上做到了功能無關(guān)了
          只剩下html包和util包。lang包這種語言兼容包不說。

          現(xiàn)在的類庫只有(數(shù)據(jù)拷貝自JSI jsdoc):

          #js.html //保留這個包,因為這些實在太常用了,
             * BrowserInfo
             //保留Decorator是因為裝飾器初始化,還是受到點特別關(guān)照
             * Decorator
             * EventUtil
             * StyleUtil

          #js.util//保留這個包主要因為異步裝載用到這些類庫
              * LoadTask
              * Request
              * ScriptLoadTask
              * TaskQueue


          現(xiàn)在的類庫只有(數(shù)據(jù)拷貝自JSI jsdoc):

          #js.html //保留這個包,因為這些實在太常用了,
             * BrowserInfo
             
          //保留Decorator是因為裝飾器初始化,還是受到點特別關(guān)照
             * Decorator
             
          * EventUtil
             
          * StyleUtil

          #js.util
          //保留這個包主要因為異步裝載用到這些類庫
             * LoadTask
             
          * Request
             
          * ScriptLoadTask
             
          * TaskQueue 

          歡迎大家提出自己的看法:)



          posted @ 2007-06-07 11:48 金大為 閱讀(755) | 評論 (12)編輯 收藏
          JSI 自身提供一些常用API,數(shù)量極少,盡量以一種正式的風(fēng)格提供,盡量回避爭議。
          有些是啟動文件用到的,如任務(wù)隊列支持,還有如裝飾引擎直接用到的,如BrowserInfo、EventUtil、StyleUtil等。
          對于啟動文件中未直接用到的,如果風(fēng)格的爭議太大,都將剔除出去。


          BrowserInfo對象:

          /**
           * BrowserInfo 對象,用于判斷瀏覽器的相關(guān)信息,如瀏覽器類型、quirks模式、客戶端語言(簡體中文?英語..未實現(xiàn))、操作系統(tǒng)(未實現(xiàn))等等。
           * @public
           
          */
          var BrowserInfo = {
            isIE : falseChecker,
            isOpera : falseChecker,
            isGecko : falseChecker,
            isNetscape : falseChecker,
            isMozilla : falseChecker,
            isFirefox : falseChecker,
            isKhtml : falseChecker,
            isSafari : falseChecker,
            isKonqueror : falseChecker,
            isQuirks : 
          function(){…}
          };

          其中最常用的要數(shù) is<瀏覽器類別>(最小版本號碼,最大版本號)。
          此外,我還將BrowserInfo的函數(shù)拷貝到navigator對象上,這個有無必要呢?
          //@Deprecated ???
          for(var n in BrowserInfo){
            window.navigator[n] 
          = BrowserInfo[n];
          }

          不同之處:

          現(xiàn)在在瀏覽器判斷上面,一般是用常量表示,比如isIE之類的,JSI的BrowserInfo使用函數(shù),以便提供更強大更靈活的功能。

          EventUtil
          EventType 對象的成員函數(shù)有:

          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樹構(gòu)造完成但圖片資源等可能未完成時觸發(fā)。
          對于這種事件類型, element,  captrue參數(shù)都將忽略。暫時只有添加函數(shù),沒有刪除函數(shù)(有刪除的必要嗎?)。

          不同之處:

          這個事件處理函數(shù)集與其他常見方式的卻別有:
          1. this支持。IE的attach方法添加的函數(shù),運行時this指向window對象,JSI吧這點給糾正過來,與w3c的addEventListener行為一致。
          2. 事件類型直接體現(xiàn)在函數(shù)名中,這樣有利于書寫上的錯誤及早發(fā)現(xiàn)。
          3. 事件格式化,將事件的訪問方式格式化為W3C的方式。
          4. 自動清理,這也不算不同吧,現(xiàn)在大多數(shù)JS庫都提供這個功能,就是在離開頁面時清理全部注冊事件。但是這對一些單頁程序是無效的(OPOA,本人也比較討厭這種模式,呵呵),以后是否可以提供一個purgeElement函數(shù),用于清理指定元素及其子元素的事件呢?
          非常希望大家積極發(fā)表自己的看法,該修改就修改,如果爭議太大,那么我將吧這些從系統(tǒng)API中移除。

          程序下載

          這個API也可以脫離JSI使用,只是,在編寫的時候,因為有了JSI的保護(hù),我使用了不少內(nèi)部變量,為避免可能的沖突,做了如下處理。


          var BrowserInfo = function(){
            
          //#include(browser-info.js).
            return BrowserInfo;
          }

          var EventUtil = function(){
            
          //#include(event-util.js).
            return EventUtil;
          }

          下載地址


          posted @ 2007-06-06 12:17 金大為 閱讀(734) | 評論 (0)編輯 收藏

          QQ群里無聊的對話,貼出來:

          小馬猴(53958317) 20:31:20
          那二進(jìn)制還中國發(fā)明的呢
          五風(fēng)樓客(63515213) 20:36:02
          哦,二進(jìn)制與中國什么關(guān)系,還真不知道呢,呵呵?
          五風(fēng)樓客(63515213) 20:36:23
          那個朝代的事呢?
          小馬猴(53958317) 20:35:43
          據(jù)說是萊布尼茨在周易中發(fā)現(xiàn)了二進(jìn)制
          海闊天空(149788288) 20:35:46
          我也孤陋寡聞了
          小馬猴(53958317) 20:36:02
          就是那個八卦圖
          五風(fēng)樓客(63515213) 20:37:04
          ^_^,強
          五風(fēng)樓客(63515213) 20:37:49
          今天才知道,我們大中國計算機技術(shù)領(lǐng)先西方三千年:)
          海闊天空(149788288) 20:37:16
          是啊是啊,中國領(lǐng)先的多著呢

          五風(fēng)樓客(63515213) 20:38:09
          不止,估計有個四千年左右把:)
          呵呵
          小馬猴(53958317) 20:37:22
          不過外國人看周易,發(fā)明了計算機,中國人看周易,發(fā)明了算命。
          小馬猴(53958317) 20:38:25
          搜狐這兩天就請了幫看風(fēng)水的人去看他總部呢。那些看風(fēng)水的就是什么周易什么什么研究會的。
          五風(fēng)樓客(63515213) 20:39:20
          找張八卦圖看看,能不能發(fā)現(xiàn)什么玄機呢:)
          海闊天空(149788288) 20:38:56
          八卦新聞
          五風(fēng)樓客(63515213) 20:40:08
          不管什么新聞,俺是一直非常鄙視搜狐的。
          小馬猴(53958317) 20:39:23
          我估計八卦圖說不定是中國古代發(fā)明的圖靈機呢
          小馬猴(53958317) 20:39:29
          哈哈
          Tu-160(382392596) 20:41:50
          哈哈哈
          海闊天空(149788288) 20:42:03
          八卦是好東西啊,兩儀生四向,四向生八卦
          海闊天空(149788288) 20:42:17
          下面一句是什么來著
          五風(fēng)樓客(63515213) 20:44:06
          太極生兩儀 兩儀生四向 四向生八卦 八卦生萬物
          小馬猴(53958317) 20:43:49
          嗯,于是萊布尼茨從這句話悟出了二進(jìn)制
          五風(fēng)樓客(63515213) 20:45:19
          呵呵,原來最早使用8進(jìn)制的不是瑪雅人,是俺們先輩,呵呵
          海闊天空(149788288) 20:44:34
          確實有2進(jìn)制的意思啊

          海闊天空(149788288) 20:44:43
          中國古代是用16進(jìn)制吧?
          五風(fēng)樓客(63515213) 20:45:51
          恩,至少重量單位是的
          五風(fēng)樓客(63515213) 20:46:23
          小時候還經(jīng)常聽老人們說16量的秤,呵呵
          海闊天空(149788288) 20:47:05
          一打
          霖雨(3366414) 20:47:35
          半斤八兩

          posted @ 2007-06-06 08:19 金大為 閱讀(228) | 評論 (2)編輯 收藏
          僅列出標(biāo)題
          共6頁: 上一頁 1 2 3 4 5 6 下一頁 
          主站蜘蛛池模板: 吉木乃县| 崇左市| 常熟市| 安福县| 九龙城区| 丁青县| 泉州市| 宁远县| 四平市| 永泰县| 阳朔县| 龙里县| 绿春县| 永和县| 明光市| 安庆市| 万全县| 昭苏县| 黔西县| 南部县| 漯河市| 德清县| 体育| 金沙县| 龙游县| 寻甸| 郑州市| 凤城市| 白朗县| 漳浦县| 正安县| 忻州市| 会理县| 绥化市| 都江堰市| 抚宁县| 阳曲县| 岳西县| 汉寿县| 蓝山县| 惠东县|