Java远程调用性能测试
http://zwbill.iteye.com/
- by zvane
现在,Java远程调用方法很多,各种方法的优缺点网络上也有很多的参考文章,这次我对几个典型的Java远程调用方法做了一个简单的性能分析比较,可供大家参考。
测试环境:CPU:奔腾双核 T4500,内存:DDR3-1067 2G,Web容器:Tomcat6.0.33,操作系统:WinXP-sp3
测试项目:
1.RMI:用Spring3集成发布。
2.hessian:用Spring3集成发布到Tomcat容器。
3.Java6 WebService:使用Java6原生WebService和注解,直接用Endpoint.publish发布服务。
4.CXF:用Spring3集成发布到Tomcat容器。
测试结果:
测试案例 |
单线程访问 |
并发访问 |
请求数 |
耗时(s) |
吞吐量 (每秒处理请求数) |
总请求数 (每个线程1000) |
并发线程数 |
耗时(s) |
吞吐量 (每秒处理请求数) |
RMI |
10000 |
5.91 |
1693 |
100000 |
100 |
31.77 |
3148 |
Hessian |
10000 |
11.13 |
899 |
100000 |
100 |
/ |
/ |
Java6 WebService |
10000 |
18.52 |
540 |
100000 |
100 |
134.52 |
743 |
CXF |
10000 |
27.58 |
363 |
100000 |
100 |
194.74 |
514 |
说明:以上测试虽不是非常的精确,但基本能说明一定的问题。每项案例的服务端方法,都是简单方法,接收客户端传递的一个String类型参数,并打印到console。每轮测试取三次时间的平均值。所有单线程访问测试全部完成并正常处理请求,没有请求拒绝情况发生。而并发访问测试,除hessian中途抛异常无法完成,其余均正常完成测试。
结论:
1.RMI的性能最高,这已是公认,RMI底层基于Java远程方法协议(JRMP)和对象序列化技术,而JRMP是直接基于TCP/IP协议的封装,在网络上传输2 byte的有效数据,对于TCP而言,总共有478 byte被额外传输,而对于RMI, 1645byte被额外传输。可见RMI的效率还是相当不错的。JavaEE标准的EJB就是基于RMI的调用。
2. hessian是一个轻量级的remoting on http框架。Hessian没有采用WebService标准的SOAP协议,而是自己实现了一种二进制RPC(Remote Procedure Call Protocol,远程过程调用协议)协议。Hessian的设计理念就是简单高效,使用 Hessian 传输数据量比Soap协议要小很多。这也是为什么Hessian的性能要高于WebService。但是,尽管它再简单高效,它始终是基于Http协议上封装的,所以还是比Java的RMI效率要差一些。我看过其他的一些研究测试报告称Hessian在传输少量对象时,比RMI还要快速高效,但传输数据结构复杂的对象或大量数据对象时,较RMI要慢20%左右。这个结论在我的测试中还真没有发现,也许与测试环境或方法有关系吧。
3.Java6WebService 和 CXF的性能应该说是基本同级别,前者略高于后者。众所周知WebService是基于Soap协议实现的,而Soap协议是在Http协议基础上的XML定义和封装。所有的请求和响应都要被转化成符合SOAP标准的XML格式。显然这直接会导致效率的降低。
XML格式的协议是一种易读易理解的协议,但并不高效。解析和组装XML协议数据流都需要耗费系统的处理时间,所以,WebService的性能不如Hessian。这里要说一下的是Java6原生的WebService,开发起来非常方便,而且无需额外引入一大堆的Jar包。性能又强于CXF,至于Axis2和Axis1就更不用说,已经有很多测试表明CXF的性能是Axis2的2倍以上,是Axis1的2-6倍。
4.那么既然RMI性能那么好,为什么我们需要那么多其他的远程调用方式呢?这个问题又引发到了一个原始的真理。越原始越底层的技术效率就越高,但局限性也就越大。RMI是Java的特性,那么它必须基于JVM运行,也就是说RMI无法跨语言运行。而WebService就不同了,Soap是基于标准Http协议的,是一种与语言无关的字符级协议,所以它可以更好的实现异构系统的通信。这在我们现实环境中是非常有用的,相信大家还是WebService用的比较多点吧。
不足:这次的测试,还是存在很多不足之处。
1.Hessian的并发测试时,跑到中途大约300-400次调用时就抛异常中断了,具体原因还没来得及仔细分析。不知道是否与Spring集成或测试方法有关系。
2.另外,这次的远程方法都是简单处理方法,而在复杂方法调用环境下测试情况如何还需更进一步研究。
3.下一步,如果有时间,可以发布到Linux环境测试一下各项性能。
分享到:
相关推荐
Java远程调用工具是开发过程中不可或缺的利器,尤其在处理分布式系统和服务之间的交互时。本文将深入探讨如何利用Java技术进行远程调用,特别是针对WebService和RESTful接口的调用,以及一个常用的工具——SoapUI。 ...
### Java远程调用Kettle说明与代码 #### 概述 Kettle是一款强大的开源ETL工具,用于数据清洗和加载。随着数据量的增长以及对数据处理能力的需求提升,分布式执行ETL任务变得越来越重要。Kettle为此提供了名为Carte...
总之,Java调用本地的远程桌面连接是一种结合操作系统功能和Java编程的技术,它在自动化运维、远程支持等领域有着广泛的应用。然而,使用时需要注意安全性和稳定性,确保数据的保密性,并考虑在不同环境下的兼容性。
总之,通过Java实现分布式系统和远程方法调用是一项强大的技术,可以极大地提升应用程序的性能和可扩展性。通过深入理解RMI的工作机制和最佳实践,开发者可以构建出健壮且高效的分布式应用。而提供的资源文件可以...
本实例将深入探讨Spring的远程调用功能,通过一个简单的例子来帮助理解其工作原理和实施步骤。 首先,我们要明确Spring远程调用(Remoting)的基本概念。远程调用是指应用程序的不同组件或服务之间,通过网络进行...
标题 "exchange/powershell,Java调用powershell开通邮箱" 暗示了这是一个关于使用Java编程语言调用PowerShell脚本在Exchange服务器上创建邮箱的教程或项目。Exchange是微软提供的一款企业级电子邮件服务器软件,而...
在IT行业中,尤其是在开发零售或餐饮系统的背景下,Java调用小票打印机打印购物清单是一项常见的任务。这个过程涉及到几个关键的技术点,包括打印机驱动的处理、串口通信、文本格式化以及与硬件设备的交互。以下是对...
Java远程桌面控制是一种技术,允许用户通过网络连接到另一台计算机并进行实时的屏幕查看、键盘输入和鼠标操作。在Java中实现这种功能通常涉及到网络编程、多线程以及图形用户界面(GUI)的设计。本篇文章将深入探讨...
AXIS2远程调用WebService是Java开发者在进行分布式服务交互时常用的一种技术。本文将详细介绍如何使用Eclipse集成开发环境和AXIS2框架创建并调用WebService。首先,我们需要准备以下基础工具: 1. Eclipse IDE:这...
提供一个测试类,可以直接运行以验证功能。测试类应包含初始化HttpClient、发送请求、处理响应并保存数据的逻辑。确保在测试前配置好所有必要的环境变量和依赖。 综上所述,这个例子展示了如何使用HttpClient从...
在这个“Spring+RMI”的示例中,开发者可能已经完成了上述步骤,并且经过测试确保了远程调用的正确性。通过学习和理解这些内容,你可以创建自己的Spring-RMI应用,实现不同节点间的分布式服务交互。
首先,你需要在服务器上创建一个DWR配置文件(通常为`dwr.xml`),声明哪些Java方法可以被远程调用。然后,创建一个Java类并暴露需要访问的方法。最后,在JavaScript中,你可以使用DWR提供的API(如`DWREngine`或`...
在本实例中,我们将探讨如何利用XFire实现实时的远程调用,并查看提供的客户端代码(ClientFromInterface.java)和服务器端代码(WS_Server)。 首先,让我们深入了解XFire的基础知识。XFire是一个基于Java的Web...
在本实例中,我们将探讨如何使用Java Web应用程序远程调用SAS程序,这涉及到Web服务技术与统计分析软件SAS的集成。以下是相关知识点的详细说明: 1. **Web服务**: Web服务是通过HTTP协议传输数据的服务,它使用...
至于压缩包中的"java连接shell"文件,可能包含了示例代码、配置文件或者测试脚本,这些资源可以帮助开发者更好地理解和实践Java远程调用Shell的过程。通过学习和研究这些文件,可以加深对这个主题的理解,并能够将...
它提供了一种服务治理、远程调用、集群容错、监控等全面功能,使得开发者可以方便地构建可扩展的服务架构。本篇文章将深入讲解如何使用Dubbo进行Java接口的调用。 首先,理解Dubbo的核心概念: 1. **服务(Service...
Java调用Shell脚本是IT专业人士必须掌握的一项技能,它不仅增强了程序的灵活性和功能,还提供了与操作系统底层交互的能力。熟练掌握这一技术,将极大地提升你在项目开发和系统管理中的效率和效果。通过本文的讲解,...
Java作为一种跨平台的编程语言,提供了丰富的API和库,使得开发者能够实现远程控制功能,包括屏幕共享和双向通信。以下将详细阐述如何使用Java实现远程控制屏幕以及实现互相通信的关键知识点。 1. **RMI(Remote ...
在Java编程中,有时我们需要模拟浏览器发送HTTP请求,例如调用外部接口或API。`HttpURLConnection`是Java标准库提供的一种轻量级的HTTP客户端,它允许我们在后台代码中发送GET和POST请求。本篇文章将深入讲解如何...
9. **测试与调试**:为了确保Java客户端能正确调用C++服务,需要进行充分的测试。可以使用JUnit等单元测试框架,或者专门的SOAP测试工具如SOAPUI进行测试。 通过理解以上知识点,开发者可以成功地实现Java客户端...