论坛首页 Java企业应用论坛

else if 与反射invoke性能比较测试(用于servlet判断调用方法)

浏览 10341 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-02-22   最后修改:2010-02-28

else if 与反射invoke性能比较测试(用于servlet判断调用方法),从测试结果看,只有几个方法的时候直接用if else if比较快,第一次使用invoke的时候花费的时间比较长,但之后基本上一致,比较平稳。在100个方法以后invoke方法比else少一个数量级别的时间,不过差别都是在纳秒范围内。

但采用invoke有一个明显的优势就是增加新的方法的时候不需要写判断语句的代码,直接添加方法就可以了,可以节省很长一段else if 代码的判断和维护。

 

两次运行结果:

 if method1用时:55147纳秒,0毫秒

 invoke method1用时:227628纳秒,0毫秒

 

 if method2用时:49518纳秒,0毫秒

 invoke method2用时:52185纳秒,0毫秒

 

 if method100用时:193578纳秒,0毫秒

 invoke method100用时:41914纳秒,0毫秒

 

 if method500用时:507870纳秒,0毫秒

 invoke method500用时:42386纳秒,0毫秒

 

 if method1000用时:496012纳秒,0毫秒

 invoke method1000用时:44326纳秒,0毫秒


 =====================================

 if method1用时:48170纳秒,0毫秒

 invoke method1用时:216665纳秒,0毫秒

 

 if method2用时:50090纳秒,0毫秒

 invoke method2用时:52676纳秒,0毫秒

 

 if method100用时:195969纳秒,0毫秒

 invoke method100用时:44236纳秒,0毫秒

 

 if method500用时:497615纳秒,0毫秒

 invoke method500用时:43714纳秒,0毫秒

 

 if method1000用时:494152纳秒,0毫秒

 invoke method1000用时:43538纳秒,0毫秒

=======================================

 

下面是测试代码:

 http://code.google.com/p/coos/source/browse/trunk/coos/src/com/coos/util/TestCase.java

 

下面是实现的servlet接口代码:

http://code.google.com/p/coos/source/browse/trunk/coos/src/com/coos/util/GetData.java

 

注:javaeye本身的语法着色js导致浏览器运行过慢弹出提示框,点击是就不显示我的代码了,所以用googlecode的代码功能!

   发表时间:2010-02-22  
switch 会更快一点
0 请登录后投票
   发表时间:2010-02-22  
guooscar 写道
switch 会更快一点

字符串不能用 switch 的啊
0 请登录后投票
   发表时间:2010-02-22  
hellojinjie 写道
guooscar 写道
switch 会更快一点

字符串不能用 switch 的啊


javascript 里面switch可以用字符串,java里面只能用基本数据类型,无法满足servlet里面方法名的字符串判断。而且就算可以用字符串仍然每增加一个方法都要写一个case代码,仍然没有invoke扩展性好。
0 请登录后投票
   发表时间:2010-02-22  
zdz8207 写道
hellojinjie 写道
guooscar 写道
switch 会更快一点

字符串不能用 switch 的啊


javascript 里面switch可以用字符串,java里面只能用基本数据类型,无法满足servlet里面方法名的字符串判断。而且就算可以用字符串仍然每增加一个方法都要写一个case代码,仍然没有invoke扩展性好。

做个查找表,绕一绕还是可以的...
0 请登录后投票
   发表时间:2010-02-23  
hellojinjie 写道
guooscar 写道
switch 会更快一点

字符串不能用 switch 的啊

最近版本的sun jdk,switch已经支持字符串了。
0 请登录后投票
   发表时间:2010-02-23  
请问谁能告诉我一下,LZ写这个servlet的场景吗? LZ是在写自己的框架吗?是不是把方法名传给你的servlet,这个servlet会转发给对应的方法?
0 请登录后投票
   发表时间:2010-02-23  
感觉elseif在前几次的比较中比较有价值,之后的比较。。。应该没人那么写吧?
0 请登录后投票
   发表时间:2010-02-23  
个人认为,Web应用要这么玩儿,就走偏了。不值得花时间。
0 请登录后投票
   发表时间:2010-02-23  
当你的代码中出现第一个elseif的时候,肯定会出现第二个。

选择使用invoke的方式是对的。

问题不在于性能,在于楼主的设计对于以后的影响。
1 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics