当前位置:首页 > 开发 > 互联网 > 正文

基于mina架构的JTT808协议两种解码方式性能比较

发表于: 2014-11-26   作者:bigboy菠萝的海   来源:转载   浏览:
摘要: 方案一继承CumulativeProtocolDecoder,实现doDecode方法进行解码; 方案二继承ProtocolDecoder ,实现decode方法进行解码; 在一台普通pc机(默认配置的Eclipse中直接运行测试程序)上测试客户端2k并发,方案一35分钟勉强达到达到150W数量,方案二只用了32分钟就已经达到150W数量。 方案一: public cl
方案一继承CumulativeProtocolDecoder,实现doDecode方法进行解码;
方案二继承ProtocolDecoder ,实现decode方法进行解码;
在一台普通pc机(默认配置的Eclipse中直接运行测试程序)上测试客户端2k并发,方案一35分钟勉强达到达到150W数量,方案二只用了32分钟就已经达到150W数量。

方案一:

public class JTT808CodecDecoder  extends CumulativeProtocolDecoder {
	       ……(此处省略N行代码)



protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)throws Exception {
		  boolean matched=false;
		  int start=in.position();
	      int limit=in.limit();
		  while (in.hasRemaining()) {
			    byte b=in.get();
			    if(!matched){
			    	if(b==JTT808Message.FLAG){
			    		 matched=true;
			    		 start=in.position()-1;
			    	}
			    	continue;
			    }
			    
			    if(b!=JTT808Message.FLAG) continue;
		
		    	int pos = in.position(); 
		    	try{
			    	if(in.hasRemaining()){
		            	b=in.get();
		            	in.position(start);
				    	in.limit(pos);
		            	if(b==JTT808Message.FLAG){
   		                 	 decode(in,out);
		            	}else{
		            		illegalMessage(in);
		            	}
		            }else{
		            	in.position(start);
				    	in.limit(pos);
		                decode(in,out);
		            }
		    	}catch(Exception e){
		    		illegalMessage(in);
		    		logger.error(e.getMessage(),e);
		    	}finally{
		    		in.limit(limit);
		    		in.position(pos);
		    	}
		    	return true;
	     }
		  
		 if(matched){
			 in.limit(limit);
			 in.position(start);
			 return false;
		 } 
		 
		 return true;
    }
	 

	private void decode(IoBuffer buf,ProtocolDecoderOutput out){
		 int size=buf.limit()-buf.position();
 		 byte[] bytes = new byte[size];
 		 buf.get(bytes,0, bytes.length);
 		 



  ……(此处省略N行代码)

}
  ……(此处省略N行代码)

}




方案二:


public class JTT808CodecDecoder implements ProtocolDecoder {
	
         ……(此处省略N行代码)

	//此解码方式性能更高
	public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)throws Exception {
		  Context ctx = getContext(session);
		  boolean mark=false;
		  if(ctx.getBuf().position()>0){
			  if(ctx.getBuf().get(0)==JTT808Message.FLAG){
					 mark=true;
			  }else{
				  ctx.getBuf().clear(); 
			  }
		  }
		  while (in.hasRemaining()) {
			    byte b=in.get();
			    ctx.getBuf().put(b);	    
	            if(b!=JTT808Message.FLAG) continue;
	            if(mark){
            		if(in.hasRemaining()){
            			b=in.get();
            			if(b==JTT808Message.FLAG){
            				decode(ctx.getBuf(),out);
            			}else{
            				logger.error("illegal message:"+bytesToHexString(ctx.getBuf().array()));
            				out.write("-1");
            			}
            			ctx.getBuf().clear(); 
        				ctx.getBuf().put(b);
        				mark=true;
            		}else{
            			decode(ctx.getBuf(),out);
            			ctx.getBuf().clear();
            		}
	            }else{
	            	mark=true;  
	            }
	     }
    }
	
	private void decode(IoBuffer buf,ProtocolDecoderOutput out){
		int size=buf.position();
		buf.flip();
		byte[] bytes = new byte[size];
		buf.get(bytes);

                ……(此处省略N行代码)
        }
       ……(此处省略N行代码)
}

基于mina架构的JTT808协议两种解码方式性能比较

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
相比在SQL Server 2000 中使用的分页方式,在SQL Server 2005中使用新的语法ROW_NUMBER()来分页效率
本文以mina 2.0.7为基础,记录mina nio网络接口的内部结构及消息流。 Java代码 public static void
总体框架 之前的一个项目用到了MINA,最近想再系统的整理一下 基于MINA框架的应用程序架构应该是这
来源:http://john521.iteye.com/blog/1099574 有一个很不错的工具http://github.com/eishay/jvm-se
最近一段时间以来,mina很火,和移动开发一样,异常的火爆。前面写了几篇移动开发的文章,都还不错
[size=large] 搞过oracle开发的人都知道,oracle在10g之后推出了新的job创建方式。10g引入的这个dbms
【前言】 在开发过程中,我们对Eclipse或MyEclipse等IDE越来越熟悉了。在使用的过程中,小编了解到
如果需要使 Map 线程安全,大致有这么四种方法: 1、使用 synchronized 关键字,这也是最原始的方法
如果需要使 Map 线程安全,大致有这么四种方法: 1、使用 synchronized 关键字,这也是最原始的方法
如果需要使 Map 线程安全,大致有这么四种方法: 1、使用 synchronized 关键字,这也是最原始的方法
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号