/* * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ package org.apache.qpid.codec; import org.apache.qpid.framing.*; import org.apache.mina.common.*; import org.apache.mina.common.support.BaseIoSession; import org.apache.mina.filter.codec.ProtocolDecoderOutput; import org.apache.mina.filter.codec.ProtocolEncoderOutput; import java.net.SocketAddress; /** */ public class BasicDeliverTest { public static void main(String[] argv) throws Exception { BasicDeliverTest test = new BasicDeliverTest(); //warm up: test.encode(512, 100000); //real tests: test.encode(16, 10000, 15); test.encode(32, 10000, 15); test.encode(64, 10000, 15); test.encode(128, 10000, 15); test.encode(256, 10000, 15); test.encode(512, 10000, 15); test.encode(1024, 10000, 15); test.encode(2048, 10000, 15); test.decode(16, 10000, 15); test.decode(32, 10000, 15); test.decode(64, 10000, 15); test.decode(128, 10000, 15); test.decode(256, 10000, 15); test.decode(512, 10000, 15); test.decode(1024, 10000, 15); test.decode(2048, 10000, 15); } void decode(int size, int count, int iterations) throws Exception { long min = Long.MAX_VALUE; long max = 0; long total = 0; for (int i = 0; i < iterations; i++) { long time = decode(size, count); total += time; if (time < min) { min = time; } if (time > max) { max = time; } } System.out.println("Decoded " + count + " messages of " + size + " bytes: avg=" + (total / iterations) + ", min=" + min + ", max=" + max); } long decode(int size, int count) throws Exception { AMQDataBlock block = getDataBlock(size); ByteBuffer data = ByteBuffer.allocate((int) block.getSize()); // XXX: Is cast a problem? block.writePayload(data); data.flip(); AMQDecoder decoder = new AMQDecoder(false); long start = System.currentTimeMillis(); for (int i = 0; i < count; i++) { decoder.decode(session, data, decoderOutput); data.rewind(); } return System.currentTimeMillis() - start; } void encode(int size, int count, int iterations) throws Exception { long min = Long.MAX_VALUE; long max = 0; long total = 0; for (int i = 0; i < iterations; i++) { long time = encode(size, count); total += time; if (time < min) { min = time; } if (time > max) { max = time; } } System.out.println("Encoded " + count + " messages of " + size + " bytes: avg=" + (total / iterations) + ", min=" + min + ", max=" + max); } long encode(int size, int count) throws Exception { IoSession session = null; AMQDataBlock block = getDataBlock(size); AMQEncoder encoder = new AMQEncoder(); long start = System.currentTimeMillis(); for (int i = 0; i < count; i++) { encoder.encode(session, block, encoderOutput); } return System.currentTimeMillis() - start; } private final ProtocolEncoderOutput encoderOutput = new ProtocolEncoderOutput() { public void write(ByteBuffer byteBuffer) { } public void mergeAll() { } public WriteFuture flush() { return null; } }; private final ProtocolDecoderOutput decoderOutput = new ProtocolDecoderOutput() { public void write(Object object) { } public void flush() { } }; private final IoSession session = new BaseIoSession() { protected void updateTrafficMask() { //To change body of implemented methods use File | Settings | File Templates. } public IoService getService() { return null; //To change body of implemented methods use File | Settings | File Templates. } public IoServiceConfig getServiceConfig() { return null; } public IoHandler getHandler() { return null; //To change body of implemented methods use File | Settings | File Templates. } public IoSessionConfig getConfig() { return null; //To change body of implemented methods use File | Settings | File Templates. } public IoFilterChain getFilterChain() { return null; //To change body of implemented methods use File | Settings | File Templates. } public TransportType getTransportType() { return null; //To change body of implemented methods use File | Settings | File Templates. } public SocketAddress getRemoteAddress() { return null; //To change body of implemented methods use File | Settings | File Templates. } public SocketAddress getLocalAddress() { return null; //To change body of implemented methods use File | Settings | File Templates. } public SocketAddress getServiceAddress() { return null; //To change body of implemented methods use File | Settings | File Templates. } public int getScheduledWriteRequests() { return 0; //To change body of implemented methods use File | Settings | File Templates. } public int getScheduledWriteBytes() { return 0; //To change body of implemented methods use File | Settings | File Templates. } }; private static final char[] DATA = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); static CompositeAMQDataBlock getDataBlock(int size) { //create a frame representing message delivery AMQFrame[] frames = new AMQFrame[3]; frames[0] = wrapBody(createBasicDeliverBody()); frames[1] = wrapBody(createContentHeaderBody()); frames[2] = wrapBody(createContentBody(size)); return new CompositeAMQDataBlock(frames); } static AMQFrame wrapBody(AMQBody body) { AMQFrame frame = new AMQFrame(1, body); return frame; } static ContentBody createContentBody(int size) { ContentBody body = new ContentBody(); body.payload = ByteBuffer.allocate(size); for (int i = 0; i < size; i++) { body.payload.put((byte) DATA[i % DATA.length]); } return body; } static ContentHeaderBody createContentHeaderBody() { ContentHeaderBody body = new ContentHeaderBody(); body.properties = new BasicContentHeaderProperties(); body.weight = 1; body.classId = 6; return body; } static BasicDeliverBody createBasicDeliverBody() { BasicDeliverBody body = new BasicDeliverBody((byte) 8, (byte) 0, BasicDeliverBody.getClazz((byte) 8, (byte) 0), BasicDeliverBody.getMethod((byte) 8, (byte) 0), new AMQShortString("myConsumerTag"), 1, new AMQShortString("myExchange"), false, new AMQShortString("myRoutingKey")); return body; } }