package serializers; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.PrintWriter; import serializers.avro.AvroSpecific; import serializers.jackson.*; import serializers.kryo.Kryo; import serializers.protobuf.Protobuf; import serializers.xml.XmlStax; /** * Alternative benchmark which uses a sequence of data items for testing, * instead of a single item that main test uses. */ public class MediaStreamBenchmark extends BenchmarkBase { public static void main(String[] args) { new MediaStreamBenchmark().runBenchmark(args); } private void runBenchmark(String[] args) { runBenchmark(args, Create, Serialize, Deserialize); } @Override protected void addTests(TestGroups groups) { // Binary Formats; language-specific ones JavaManual.register(groups); Hessian.register(groups); Kryo.register(groups); FastSerialization.register(groups); JBossSerialization.register(groups); JBossMarshalling.register(groups); // Binary formats, generic: protobuf, thrift, avro, CKS, msgpack Protobuf.register(groups); Thrift.register(groups); AvroSpecific.register(groups); // JSON JacksonJsonManual.register(groups); JacksonJsonDatabind.register(groups); JacksonWithAfterburner.registerJSON(groups); // databind with bytecode generation (faster) // JSON-like // share both names & values for data streams: JacksonSmileManual.register(groups, true, true); JacksonSmileDatabind.register(groups, true, true); JacksonWithAfterburner.registerSmile(groups, true, true); // XML (only fastest codecs) XmlStax.register(groups, false, true, true); // skip woodstox, include aalto and fast-infoset } @Override protected Object convertTestData(TestGroup.Entry<?,Object> loader, Params params, byte[] data) throws Exception { String extra = params.dataExtra; int count = 0; try { count = Integer.parseInt(extra); } catch (Exception e) { throw new IllegalArgumentException("Non-integer extra part ('"+extra+"') of data file: must be count"); } Object[] deserialized = loader.serializer.deserializeItems(new ByteArrayInputStream(data), count); return loader.transformer.reverseAll(deserialized); } @Override protected <J> byte[] serializeForSize(Transformer<J,Object> transformer, Serializer<Object> serializer, J value) throws Exception { @SuppressWarnings("unchecked") Object[] result = transformer.forwardAll((J[]) value); return serializer.serializeAsBytes(result); } @Override protected <J> void checkCorrectness(PrintWriter errors, Transformer<J,Object> transformer, Serializer<Object> serializer, J input) throws Exception { // nasty cast, but works (and has to be used) here: @SuppressWarnings("unchecked") J[] items = (J[]) input; for (J item : items) { checkSingleItem(errors, transformer, serializer, item); } } // ------------------------------------------------------------------------------------ // Test case objects // ------------------------------------------------------------------------------------ protected final TestCase Create = new TestCase() { public <J> double run(Transformer<J,Object> transformer, Serializer<Object> serializer, J value, int iterations) throws Exception { @SuppressWarnings("unchecked") J[] src = (J[]) value; Object[] result = new Object[src.length]; long start = System.nanoTime(); for (int i = 0; i < iterations; i++) { transformer.forward(src, result); } return iterationTime(System.nanoTime() - start, iterations); } }; protected final TestCase Serialize = new TestCase() { public <J> double run(Transformer<J,Object> transformer, Serializer<Object> serializer, J value, int iterations) throws Exception { @SuppressWarnings("unchecked") J[] src = (J[]) value; Object[][] objects = new Object[iterations][]; for (int i = 0; i < iterations; i++) { objects[i] = transformer.forwardAll(src); } ByteArrayOutputStream out = serializer.outputStreamForList(src); long start = System.nanoTime(); for (int i = 0; i < iterations; i++) { serializer.serializeItems(objects[i], out); out.reset(); } return iterationTime(System.nanoTime() - start, iterations); } }; protected final TestCase Deserialize = new TestCase() { public <J> double run(Transformer<J,Object> transformer, Serializer<Object> serializer, J value, int iterations) throws Exception { @SuppressWarnings("unchecked") J[] src = (J[]) value; byte[] bytes = serializer.serializeAsBytes(transformer.forwardAll(src)); long start = System.nanoTime(); for (int i = 0; i < iterations; i++) { serializer.deserializeItems(new ByteArrayInputStream(bytes), src.length); } return iterationTime(System.nanoTime() - start, iterations); } }; // 16-May-2012, Nate: As discussed on mailing list, removed these two as they only exist in an attempt to // make the comparison with ActiveMQProtobuf fair with the rest of the serializers. This adds overhead to // the rest of the serializers, skewing the results. ActiveMQProtobuf has been disabled, so these aren't needed. // protected final TestCase DeserializeAndCheck = new TestCase() // { // public <J> double run(Transformer<J,Object> transformer, Serializer<Object> serializer, J value, int iterations) throws Exception // { // @SuppressWarnings("unchecked") // J[] src = (J[]) value; // byte[] bytes = serializer.serializeAsBytes(transformer.forwardAll(src)); // long start = System.nanoTime(); // for (int i = 0; i < iterations; i++) { // Object[] items = serializer.deserializeItems(new ByteArrayInputStream(bytes), src.length); // for (Object item : items) { // transformer.reverse(item); // } // } // return iterationTime(System.nanoTime() - start, iterations); // } // }; // // protected final TestCase DeserializeAndCheckShallow = new TestCase() // { // public <J> double run(Transformer<J,Object> transformer, Serializer<Object> serializer, J value, int iterations) throws Exception // { // @SuppressWarnings("unchecked") // J[] src = (J[]) value; // byte[] bytes = serializer.serializeAsBytes(transformer.forwardAll(src)); // long start = System.nanoTime(); // for (int i = 0; i < iterations; i++) { // Object[] items = serializer.deserializeItems(new ByteArrayInputStream(bytes), src.length); // for (Object item : items) { // transformer.shallowReverse(item); // } // } // return iterationTime(System.nanoTime() - start, iterations); // } // }; }