linux消息队列 java_Linux下消息队列和socket绝对速度比拼[转]

在当今的网络时代,我们常常见到的进程间通信方式都是socket,比如Java的EJB调用,Java和C通信,Web Service服务等。socket是最常用的通讯技术,几乎所有的系统、语言都支持,socket也是面向网络的,通信的两方可以跨越IP网络进行传输。

在本地通信中(同一台机器上的进程间通讯),socket的网络特性却成了累赘,组装解析网络报头、报文确认、CRC校验等都是针对网络的,本地通信没有必要,反而会影响传输效率。本地通信的一些传统技术,如管道、FIFO、消息队列等,没有网络功能的负担,传输速度应该高于socket,那到底高多少以至于值得在应用中替换socket技术呢,今天就来一场小测试,就System V消息队列和socket之间,做一次全面的速度比拼。

比拼场地

本人的笔记本:赛扬1.5G 内存1.5G

系统:Ubuntu8.04 Desktop (Linux 2.6.24-24-generic)

JDK:1.6

第一回合: Java测试

先说明一下,Java并不支持System V消息队列,因此特为Java提供了JNI接口,我们使用lajp_9.09提供C源码编译的so动态连接库,lajp的下载地址和文档:

首先上场的是System V消息队列。

发送端程序:

package test;

import lajp.MsgQ;

public class TestSend

{

/** 消息队列KEY */

static final int IPC_KEY = 0×20021230;

static

{

//JNI

.loadLibrary("lajpmsgq");

}

public static void main([] args)

{

//创建或获得现有的消息队列

int msqid = MsgQ.msgget(IPC_KEY);

//发送字节数组

byte[] msg = new byte[1024];

for (int i = 0; i < 1024 * 5000; i++)

{

//每次发送1204字节到消息队列,9527是消息类型

MsgQ.msgsnd(msqid, 9527, msg, msg.length);

}

.out.println("发送结束.");

}

}

接收端程序:

package test;

import lajp.MsgQ;

public class TestRcv

{

/** 消息队列KEY */

static final int IPC_KEY = 0×20021230;

static

{

//JNI

.loadLibrary("lajpmsgq");

}

public static void main([] args)

{

//创建或获得现有的消息队列

int msqid = MsgQ.msgget(IPC_KEY);

//接收缓冲区

byte[] msg = new byte[1024];

long start = .currentTimeMillis(); //开始时间

for (int i = 0; i < 1024 * 5000; i++)

{

//每次从消息队列中接收消息类型为9527的消息,接收1204字节

MsgQ.msgrcv(msqid, msg, msg.length, 9527);

}

long end = .currentTimeMillis(); //结束时间

.out.println("用时:" + (end – start) + "毫秒");

}

}

程序很简单,需要说明的是三个JNI方法调用:

msgget()方法: System V消息队列的技术要求,含义是通过一个指定的KEY获得消息队列标识符。

msgsnd()方法: 发送。

msgrcv()方法: 接收。

发送方进行了(1024 * 5000)次发送,每次发送1024字节数据,接收方进行了(1024 * 5000)次接收,每次接收1024字节,共计发送接收5G数据。测试时先启动TestSend程序,再启动TestRcv程序,共进行5轮次测试,测试结果如下:

用时:29846毫秒

用时:29591毫秒

用时:29935毫秒

用时:29730毫秒

用时:29468毫秒

平均速度:29714毫秒

用to

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值