`

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

    博客分类:
  • java
阅读更多

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的代码功能!

分享到:
评论
25 楼 zdz8207 2010-07-19  
yuwgle 写道
invoke只比直接调用java方法,慢2倍。
不管if else 怎么样,方法调用的时间,你算进去了吗?

invoke比if else多出来的那点时间几乎可以忽略不计了,对用户来说是完全没有感觉的
24 楼 yuwgle 2010-07-15  
invoke只比直接调用java方法,慢2倍。
不管if else 怎么样,方法调用的时间,你算进去了吗?
23 楼 zdz8207 2010-02-27  
kimmking 写道
没代码,我怀疑楼主的结论。

本人一向推崇开源的,不至于发隐藏贴来忽悠大家,终于通过申诉为自己申冤了
22 楼 kimmking 2010-02-24  
没代码,我怀疑楼主的结论。
21 楼 抛出异常的爱 2010-02-24  
风花雪月饼 写道
当你的代码中出现第一个elseif的时候,肯定会出现第二个。

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

问题不在于性能,在于楼主的设计对于以后的影响。


请使用"表驱动"实践.
可以参考 代码大全2.

20 楼 crazy.j 2010-02-24  
Map里装个接口实现不行么~
19 楼 winhkey 2010-02-23  
Map<String, Integer>

switch (map.get(key))
18 楼 kingwon 2010-02-23  
如果真的在意反射invoke性能,建议采用下面方式可以避免else if的问题
初始化时构造一个map(注意只需一次),map的key为method name, value为一个函数对象,如 :
Runnable method = new Runnable()
{
public void run()
{
method();
}
};
17 楼 newid 2010-02-23  
有的时候从软件后期维护角度考虑牺牲一些性能是再所难免的。

就象现在很多人都喜欢用spring和hibernate一样。

要的就是开发、维护方便
16 楼 H_eaven 2010-02-23  
多不年了,Http协议都没变过,这个数量是固定的,直接用if-else if一点问题都没有,出发点要从扩展性要考虑.这个级别上性能考虑没多大意义 。
业务代码中,如果很有可能要扩展,那么反射带来的好处太大了,无敌的扩展性,对未知类的执行.
记着从扩展性出发。可读性,因为是框架内部实现,如果可读性不太好,但扩展性带来的好处也可以把可读性差的损失换回来.
15 楼 曾经de迷茫 2010-02-23  
这种if .. else ..if,考虑索引、Hash啊。
转换为HashSet处理试试
14 楼 y14 2010-02-23  
硬件发展得这么强大了。。。代码的可读性早就放第一位了。。。
13 楼 chandler 2010-02-23  
在性能能够接受的情况下。可读性和可扩展是第一位的。
12 楼 songfantasy 2010-02-23  
JDK7才开始支持switch中字符串
11 楼 kimmking 2010-02-23  
没代码,啥都是盲目的
10 楼 superheizai 2010-02-23  
hellojinjie 写道
guooscar 写道
switch 会更快一点

字符串不能用 switch 的啊


呵呵,看报道说1.7里面好像可以用string了,期待下
9 楼 风花雪月饼 2010-02-23  
当你的代码中出现第一个elseif的时候,肯定会出现第二个。

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

问题不在于性能,在于楼主的设计对于以后的影响。
8 楼 pipilu 2010-02-23  
个人认为,Web应用要这么玩儿,就走偏了。不值得花时间。
7 楼 hankesi2000 2010-02-23  
感觉elseif在前几次的比较中比较有价值,之后的比较。。。应该没人那么写吧?
6 楼 hommy8 2010-02-23  
请问谁能告诉我一下,LZ写这个servlet的场景吗? LZ是在写自己的框架吗?是不是把方法名传给你的servlet,这个servlet会转发给对应的方法?

相关推荐

    类的反射机制 常用的方法(简单明确)

    3. **调用方法**:通过`Class.getMethod()`或`Class.getDeclaredMethod()`获取方法对象,然后通过`Method.invoke()`方法来调用该方法。这支持调用实例方法、静态方法等。 4. **访问和修改字段**:同样地,可以通过`...

    java项目经理

    - `if`、`else`、`for`、`while`: 控制流程的关键字,用于逻辑判断和循环。 - **面向对象** - `class`: 定义类的关键字。 - `Object`、`Instance`: 对象和实例的概念,`Object` 是所有类的父类。 - `state` ...

    SpringMVC的代码简单实现

    元注解是在其他注解上使用的注解,而反射则是Java语言中的一种特性,允许程序在运行时检查类、接口、字段和方法的信息,甚至可以动态调用方法。 首先,我们需要理解SpringMVC的核心概念。它基于Model-View-...

    java必备的经典面试题

    - 使用`Method`类的`invoke()`方法,需要先通过反射获取`Method`对象。 #### 23. 如何将数值型字符转换为数字(Integer,Double)? - 可以使用`Integer.parseInt(String s)`和`Double.parseDouble(String s)`等...

    Java企业面试题整理及答案

    - **super()**: 是指父类构造器的引用,用于调用父类的构造方法或访问父类的成员。在子类构造器中使用 `super()` 可以调用父类的特定构造器,它必须是子类构造器的第一条语句。 - **this()**: 是指本类当前对象的...

    java3级考试资料

    - **方法的invoke()**:在运行时动态调用方法。 9. **注解(Annotation)**: - **预定义注解**:@Override、@Deprecated等的含义和作用。 - **自定义注解**:创建自定义注解并使用反射进行处理。 10. **Java ...

    将word文档嵌入到jsp页面的详细步骤

    在实际应用中,可以在Servlet或Action中调用此方法,例如: ```java String docFilePath = request.getSession().getServletContext().getRealPath("/") + "uploads/document/a.doc"; boolean success = ...

    Java 项目经验.pdf

    了解如何声明和使用变量、控制流程结构(if-else、for、while)、创建和调用方法、以及理解和使用类、对象和接口。 2. **异常处理**:Java中的异常分为编译时异常和运行时异常,理解这两种异常的区别至关重要。熟练...

    基于tomcat8 编写字符编码Filter过滤器无效问题的解决方法

    接着,我们使用Proxy.newProxyInstance方法创建一个代理对象,用于拦截HttpServletRequest的getParameter方法,并将获取的参数值重新编码为UTF-8。 在CharacterEncodingFilter类中,我们使用了 InvocationHandler ...

    J2EE实验报告

    它可以用来拦截Action执行前后的方法调用,并且能够根据不同的需求进行定制化的逻辑处理,如验证用户输入、记录日志、事务管理等。 #### 二、实验环境 **2.1 MyEclipse** MyEclipse是一款集成开发环境(IDE),主要...

    自定义JSP分页标签

    - **真分页**与**假分页**:在实际应用中,通常有两种分页方式:真分页是指每次只查询当前页的数据,而假分页则是先查询所有数据再进行分页展示。显然,真分页在大数据量的情况下更有效率。 - **性能优化**:在实现...

    cms后台管理

    } else if (InvokeType.userDefined == type) { if (StringUtils.isBlank(listStyle)) { throw new ParamsRequiredException(PARAM_STYLE_LIST); } //列表样式模板路径 WEB-INF\t\cms_sys_defined\style_list\...

    使用拦截器解决中文乱码

    #### 步骤三:测试与验证 完成上述步骤后,我们需要测试自定义拦截器是否有效解决了中文乱码问题。可以通过向应用发送包含中文字符的请求,并检查响应结果来验证。 #### 总结 通过上述步骤,我们可以有效地利用...

    整理后java开发全套达内学习笔记(含练习)

    invoke vt.调用 [in'vәuk]' ( invocation [,invәu'keiʃәn]) Iterator [java] 迭代器, 迭代程序 legal 合法的 ['li:gәl] log n.日志,记录 [lɒg] native (关键字) ?? ['neitiv] nested [java] 嵌套的 ['...

    Java 中责任链模式实现的三种方式

    可以看到,Servlet 中的 FilterChain 是通过 Filter 配置类来管理 Filter 的,Filter 配置类中包含了 Filter 列表和 Servlet,达到在调用真正 Servlet 之前进行各种 Filter 逻辑。 Dubbo 中的 Filter Dubbo 中的...

    Struts2.0框架技术详解

    当表单中有多个提交按钮时,可以通过为每个按钮设置不同的name属性值,然后在Action中通过`getParameters()`方法获取提交按钮的名称来判断哪个按钮被点击。 **示例代码**: ```java public String execute() { ...

Global site tag (gtag.js) - Google Analytics