Java、PHPRPC、Hessian、Burlap、AMF3、XML 序列化的效率对比

[b]2009-3-1补充:[/b]

[size=large][color=red]这次就不上图了,测试程序里有测试结果,你也可以自己跑结果。这次主要补充了跟 AMF3 的对比,在空间上 AMF3 在几种格式中略显优势,可是在时间上则相差太远,除了 XML 之外,就数它最慢了,而且还不是慢一点点,是几倍好几倍的慢。跟节省的空间来说,不成比例。

又加了 JSON 的。将序列化和反序列化时间分开了。

所以,综合来说,仍然是 PHPRPC 胜出![/color][/size]

新程序下载:[url=http://www.iteye.com/topics/download/06abfdbd-7517-31d2-aa0d-5e4c54582e4d]PHPRPC___Hessian___AMF3___JSON___XML_Test.zip[/url]

--------------------------------------- 以下为旧内容 ---------------------------------------

下面是对在 Java 6 下对 Java(就是 RMI 使用的数据表示方式)、PHPRPC、Hessian(2个协议版本都有)、Burlap 序列化/反序列化的效率对比,其中 PHPRPC 序列化来自最新版本的 [url=http://www.phprpc.org/zh_CN/download/]PHPRPC[/url] 3.0.2 for Java,Hessian 和 Burlap 序列化来自[url=http://hessian.caucho.com/#Java]Hessian[/url] 的最新版 3.2.1,Java 序列化是采用 JDK 6 中内置的功能。

测试程序可从此处下载:[url=http://www.iteye.com/topics/download/8fb86b16-4bbd-3f97-bb48-e6cd42b368a8]PHPRPC___Hessian_Test.zip[/url]

下面是测试程序的运行结果图:

[img]/upload/attachment/75902/a0d4e7fc-0a32-34f2-a74b-c257b7195044.jpg[/img]

[img]/upload/attachment/75905/191b88ad-8729-3837-8df7-4735c5769297.jpg[/img]

[img]/upload/attachment/75904/e28188d3-4c25-3e6c-8785-961cbcc96a39.jpg[/img]

[img]/upload/attachment/75906/e0d2970b-943e-37a6-915b-2dd5b321bad8.jpg[/img]

[img]/upload/attachment/75907/dc1c3752-14fc-3744-a5c4-8e81bad46173.jpg[/img]

[img]/upload/attachment/75910/0ee5d589-9aa2-3606-bdf0-10bce940072b.jpg[/img]

[img]/upload/attachment/75915/14b8f19a-6a9d-3b34-b984-30564891783d.jpg[/img]

[img]/upload/attachment/75919/5cfcdc00-e1f9-35be-93ff-bd8849be2a90.jpg[/img]

[img]/upload/attachment/75923/82cb2659-ae30-3e91-9362-0f9d28811d11.jpg[/img]

[img]/upload/attachment/75924/977666c9-18ef-3a54-81b1-cd1f0a97f5f8.jpg[/img]

[img]/upload/attachment/75930/c24dc454-f783-3279-b76b-e31f0eea61ed.jpg[/img]

[img]/upload/attachment/75933/eb4729ff-dc9a-3a49-8b3f-4494946a228f.jpg[/img]

从上面的结果来看,对于原生类型的序列化和反序列化,PHPRPC 和 Hessian 的效率差不多,对于字节流的序列化,PHPRPC 具有绝对优势,对于容器类型,来说,如果具有重复元素的话,PHPRPC 要远远好于 Hessian,对于没有重复元素的,则效率上不相上下,对于自定义类型来说,PHPRPC 也比 Hessian 效率高不少。而 Java 本身的序列化,效率对比来说波动太大,原生类型要慢好多,而复杂类型和自定义类型稍微好一些。所以总体来说,PHPRPC 在平均效能上算是这几个当中最好的了。

本来还想加入 JSON、SOAP 这些序列化方式的对比,但是找了好久都没有找到能够支持 Java 基本类型和容器类型的 JSON、SOAP 序列化的工具包。不过这两种格式的效率要比现在对比的这几种效率上低很多倍,从 [url=http://www.iteye.com/topic/301613].NET 版本[/url]的相关对比上就可以看到出来。

其实这个评测对 PHPRPC 来说,还是不公平的,因为 PHPRPC 现在是按照 Java 1.2 兼容格式编写的,因此要比那些专门为 Java 5+ 编写的代码效率要低。但是在这种情况下,仍然能够胜出,足以说明 PHPRPC 的优秀。

PHPRPC for Java 下一步的计划就是编写专门针对 Java 5+ 的优化版本,让使用 Java 5+ 的用户能够得到更高的执行效率。

补充:

bachmozart 朋友提出要看一下跟最新的 XMLEncoder 和 XMLDecoder 的对比,下面给出加入了 XMLEncoder 和 XMLDecoder 的对比测试结果图,其中标注 XML 的就是,但因为 XMLEncoder/XMLDecoder 不支持自定义类型,所以最后一个测试图上没有它。

[img]/upload/attachment/76270/dce1832f-bc4d-3989-b042-f0ff5698fe01.jpg[/img]

[img]/upload/attachment/76272/5b510672-049b-3f09-8822-9d94c712dcb1.jpg[/img]

[img]/upload/attachment/76274/750c138c-13db-3498-a73f-5aa8be60b6e2.jpg[/img]

[img]/upload/attachment/76276/acd2b688-7c6e-36af-b5d0-4c831a4e6bc5.jpg[/img]

[img]/upload/attachment/76278/24683f12-9fc7-318b-b155-6c7e09cd4c32.jpg[/img]

[img]/upload/attachment/76280/f7ef6252-a211-3049-a2ce-4e2c4df3ad4c.jpg[/img]

[img]/upload/attachment/76282/ca91849f-5f9c-3ded-a0d6-1405c2ede6e0.jpg[/img]

[img]/upload/attachment/76284/32fb8229-8c1a-32d9-b8ef-3a9b39432bf3.jpg[/img]

[img]/upload/attachment/76286/fc97350f-5629-3c7a-a9b7-7a8eb266d34b.jpg[/img]

[img]/upload/attachment/76288/b164ef3e-5a21-3db5-bc1e-3646a06eef95.jpg[/img]

[img]/upload/attachment/76290/6ff867e8-a207-3fbd-80e2-75b6f68e3a4a.jpg[/img]

[img]/upload/attachment/76292/624a0008-fdf8-335f-8a87-7cffdc600e80.jpg[/img]


大家不要惊讶,事实就是这样,XML 实在是太慢了,根本就不是一个数量级的东西。这还是最新的 Java SDK 6 update 12 中 XMLEncoder/XMLDecoder。


加入了 XMLEncoder/XMLDecoder 新程序可以从这里下载:[url=http://www.iteye.com/topics/download/d1402fa5-f85e-36a6-a302-00aacb2f72d6]PHPRPC___Hessian_Test_new.zip[/url],不过因为跑带 XML 的测试时间太长了,我把那段注释掉了,你如果希望自己跑跑看,把注释符号去掉就好。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JS JSP ASP .NET J2AM API接口和返回的版本 目前所有版本的JS JSP ASP .NET J2AM 都是提供源代码的,对于一些脚本语言来说,直接解压缩之后就可以使用了,不需要什么安装步骤。另外一些需要编译的语言,则提供了编译用的 shell 文件(Linux/Unix 下使用)和 bat 文件(Windows 下使用),或者直接提供编译好的二进制库文件。 不过为了让读者能够更清楚如何安装,我们还是对每种语言的安装都做详细的讲解,你可以在安装列表里找到你感兴趣的语言的安装方法。 示例 如果你已经把 JS JSP ASP .NET J2AM 安装好了,那么接下来就让我们开始第一个小程序吧。按照惯例,第一个演示程序几乎总是 HelloWorld,我们也不想打破这个惯例,不过对于 PHPRPC 来说,有服务器端就要有客户端,否则我们就没有什么好演示的啦,所以我们的第一个演示程序实际上是两个,一个是服务器端,另一个是客户端。我们都先用 PHP 语言来写好了。 服务器端 view plaincopy to clipboardprint? <?php include ("php/phprpc_server.php"); function HelloWorld() { return 'Hello World!'; } $server = new PHPRPC_Server(); $server->add('HelloWorld'); $server->start(); ?> 客户端 view plaincopy to clipboardprint? <?php include ("php/phprpc_client.php"); $client = new PHPRPC_Client('http://127.0.0.1/server.php'); echo $client->HelloWorld(); ?> 对于服务器端程序,我们应该将它命名为 server.php(这是因为客户端调用时用的是这个名字,而不是 PHPRPC 的什么规定),然后把它放在本地 Web 服务器的根目录下,并保证服务器可以正常运行 PHP 程序,之后在浏览器或命令行下运行客户端程序,你就可以看到结果了。 这两个程序几乎简单到无需解释的地步,所以如果你已经明白它们的意思,那么就可以直接跳过下面的解释,继续看后面的例子。 服务器端第 1 句是将 它的服务器端程序包含到你的程序里,之后的 2 - 4 句是定义一个远程调用的函数,你会发现它与本地函数没有任何区别。第 5 句是创建服务器端对象,第 6 句是添加要发布的方法,这里添加的就是刚刚定义的 HelloWorld 函数,在 PHP 中,添加的发布方法是函数名的字符串表示,在其它语言中可能略有不同。第 7 句是启动服务。 客户端就更简单了,第 1 句是将 它的客户端程序包含到你的程序里。第 2 句是创建客户端对象,其中的参数就是服务器端的地址。第 3 句是对远程方法(函数)的调用,之后通过 echo 将它显示出来。如果顺利的话,执行后你就会看到输出的 Hello World!。 上面的例子是发布的是函数,下面我们来看一下类中的静态方法如何发布: view plaincopy to clipboardprint? <?php include ("php/phprpc_server.php"); class Hello { static function HelloWorld() { return 'Hello World!'; } } $server = new PHPRPC_Server(); $server->add('HelloWorld', 'Hello'); $server->start(); ?> 这个服务器端只要它的名字与发布的地址与上面那个发布函数的例子一样的话,上面的那个客户端就可以得到同样的结果,也就是说,在客户端看来是没有任何区别的。 它并不是只可以在 PHP 中使用,它同样支持其它语言的服务器和客户端,而且还可以无差别的相互调用。 现在我们来看一下如何在 Java 中调用这个 PHP 的服务器方法: view plaincopy to clipboardprint? import org.phprpc.*; interface IHello { public String helloWorld(); } public class HelloWorld

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值