随笔-57  评论-129  文章-0  trackbacks-0
 

装载效率测试
测试页面见: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 金大为 阅读(682) | 评论 (0)编辑 收藏

 

JSI简介:

JSI 是一个 开放的、无侵入的 脚本库管理框架,内核不提供任何具体功能,有一些功能子项目,如网页装饰引擎。

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


JSA简介:
JSA最初是做JSI编译处理的一个小工具,现在也可以用来混淆、压缩脚本。支持swing和ant task两种工作方式。
可以通过webstart启动:启动JSA(允许访问文件系统)沙箱内运行(功能受限)




这次发布的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 金大为 阅读(724) | 评论 (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 金大为 阅读(109) | 评论 (0)编辑 收藏

刚发布JSA的webstart版,顺便吧这个古董级别的小程序也发布一下。
仅供那些和我一样棋术平平的无聊人士打发时间。

高手就不必了:)
当能,如果是想找个地方出出气,也可以,呵呵。


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



没有棋谱,所以,开局的棋力很差。中局还行。

posted @ 2007-06-14 10:51 金大为 阅读(725) | 评论 (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 金大为 阅读(902) | 评论 (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 金大为 阅读(716) | 评论 (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 金大为 阅读(1368) | 评论 (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 金大为 阅读(712) | 评论 (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参数都将忽略。暂时只有添加函数,没有删除函数(有删除的必要吗?)。

不同之处:

这个事件处理函数集与其他常见方式的却别有:
  1. this支持。IE的attach方法添加的函数,运行时this指向window对象,JSI吧这点给纠正过来,与w3c的addEventListener行为一致。
  2. 事件类型直接体现在函数名中,这样有利于书写上的错误及早发现。
  3. 事件格式化,将事件的访问方式格式化为W3C的方式。
  4. 自动清理,这也不算不同吧,现在大多数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 金大为 阅读(707) | 评论 (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 金大为 阅读(205) | 评论 (2)编辑 收藏
仅列出标题
共6页: 上一页 1 2 3 4 5 6 下一页