`

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会转发给对应的方法?

相关推荐

    Java方法反射调用demo

    Java反射 调用空参方法 调用Object类型参数的方法 调用基本类型参数的方法 调用基本类型数组参数的方法 调用String数组参数的方法 调用Object数组参数的方法 调用私有方法

    java反射机制,调用私有方法

    Method,invoke,getMethod等反射私有方法和私有属性

    Invoke反射

    本程序实现Invoke反射,内置说明txt文档,可以参考

    C# Invoke调用Demo

    C# Invoke多线程调用Demo......

    C#中,使用Thread新创建一个线程来查询数据库中的信息显示在控件“listView1”上,需要使用Invoke(代理名)方法来访问控件“listView1”,

    if (listView1.InvokeRequired) //判断调用方对listView1控件的调用是否需要通过Invoke方法来调用 { listView1.Invoke(dailiEvent); } else { dailiEvent(); //线程间操作无效: 从不是创建控件“listView1”...

    C#窗体中Invoke和BeginInvoke方法详解

    C_窗体中Invoke和BeginInvoke方法详解

    java反射机制及Method.invoke解释

    java反射机制描述及Method.invoke解释

    C#高效反射调用方法类实例详解

    C#高效反射调用方法类 1.创建一个业务类(HomeService),在类下创建3个方法 2.正常方式调用类的方法 3.反射方式调用类的方法 4.调用代码 5.调用结果 6.Service类方法代码 内容扩展: 1、正常方式调用类的方法...

    Invoke跨线程调用的代码

    忽略跨线程访问的错误 CheckForIllegalCrossThreadCalls = false,但是这个方法很不稳定,使用invoke方法解决跨线程访问的问题,里边有2个例子, 通过自己额外创建的线程改变label控件中的内容从而验证invoke方法

    .NET/C#利用反射调用含ref或out参数的方法示例代码

    使用反射,我们可以很容易地在运行时调用一些编译时无法确定的属性、方法等。在.NET中的反射可以实现从对象的外部来了解对象(或程序集)内部结构的功能,哪怕你不知道这个对象(或程序集)是个什么东西,另外.NET中...

    性能测试报告模板

    在测试中,我们对单次调用时间较长的方法进行了分析,结果表明,java.lang.reflect.Method.invoke 占用了 165.2% 的 CPU 时间,java.sql.PreparedStatement.execute 占用了 15.4% 的 CPU 时间,java.sql.Statement....

    使用P/Invoke来开发用于与串行设备通讯的.NET基类

    在.NET环境下编写与RS252串口通信的应用程序的唯一方法,就是引用过时了的并且有点限制的MSComm ActiveX控件。这篇文章介绍了用C#安全代码编写一个多线程的,且时尚的与RS232通讯的基础类库。这个类库使用平台调用...

    InvokeDll.rar_c#调用VC DLL

    VC++调用DLL的演示示例代码,供测试调用的CommonDll.dll已经放在测试源码的根目录下,你下载源码后可运行InvokeDll.dsw编译项目源码,将编译生成在Bin目录中的InvokeDll.exe拷贝至根目录下,双击运行,可看到程序...

    P/Invoke Interop 助手

    P/Invoke Interop Assistant,它支持托管代码和非托管代码之间的方法签名的转换,而且直接生成相关的C#或者是VB的方法调用代码。这个签名的转换,不只是适用于Windows的方法签名,只要给定一个C头文件,就可以转换...

    Java使用反射调用方法

    在使用反射可以得到类模板class对象,那么得到类模板的class对象后,如何调用某个已知的且需要的方法呢?答案是使用method类的invoke方法,那么实现的代码如下,结合jdk的api和该代码便可以知道原理 package ...

    Java反射机制及Method.invoke详解

    主要介绍了Java反射机制及Method.invoke详解,本文讲解了JAVA反射机制、得到某个对象的属性、得到某个类的静态属性、执行某对象的方法、执行某个类的静态方法等内容,需要的朋友可以参考下

    InvocationHandler中invoke()方法的调用问题分析

    主要介绍了InvocationHandler中invoke()方法的调用问题分析,具有一定参考价值,需要的朋友可以了解下。

    C#_.NET_动态调用webservice的三种方式

    最后,我们可以使用反射调用相关WebService方法。我们可以使用System.Reflection命名空间中的MethodInfo类来调用WebService方法。 需要引用的名称空间 在动态调用WebService时,我们需要引用以下四个名称空间: * ...

    Invoke 与BeginInvoke的区别

    让你快速掌握INvoke与BeginInvoke的区别,HAHA

Global site tag (gtag.js) - Google Analytics