package org.apache.thrift.protocol; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.thrift.Fixtures; import org.apache.thrift.TException; import org.apache.thrift.transport.TMemoryBuffer; public class BenchmarkProtocols { private static final Set<TProtocolFactory> FACTORIES = new LinkedHashSet<TProtocolFactory>(){{ add(new TTupleProtocol.Factory()); add(new TCompactProtocol.Factory()); add(new TBinaryProtocol.Factory()); }}; private static final int NUM_REPS = 100000; private static final int NUM_TRIALS = 10; public static void main(String[] args) throws TException { Map<TProtocolFactory, List<Long>> timesByFactory = new HashMap<TProtocolFactory, List<Long>>(); for (int trial = 0; trial < NUM_TRIALS; trial++) { for (int i = 0; i < 16; i++) { System.gc(); } // TProtocol proto = factory.getProtocol(new TTransport() { // @Override // public void write(byte[] buf, int off, int len) throws TTransportException { // } // // @Override // public int read(byte[] buf, int off, int len) throws TTransportException { // return 0; // } // // @Override // public void open() throws TTransportException { // } // // @Override // public boolean isOpen() { // return true; // } // // @Override // public void close() { // } // }); for (TProtocolFactory factory : FACTORIES) { if (timesByFactory.get(factory) == null) { timesByFactory.put(factory, new ArrayList<Long>()); } long start = System.currentTimeMillis(); for (int rep = 0; rep < NUM_REPS; rep++) { TProtocol proto = factory.getProtocol(new TMemoryBuffer(128*1024)); Fixtures.compactProtoTestStruct.write(proto); Fixtures.nesting.write(proto); } long end = System.currentTimeMillis(); timesByFactory.get(factory).add(end-start); } } for (TProtocolFactory factory : FACTORIES) { List<Long> times = timesByFactory.get(factory); // System.out.println("raw times pre-drop: " + times ); times.remove(Collections.max(times)); long total = 0; for (long t : times) { total += t; } Collections.sort(times); System.out.println(factory.getClass().getName() + " average time: " + (total / times.size()) + "ms"); System.out.println("raw times: " + times); } } }