/** * 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. */ using System; using System.Collections.Generic; using System.IO; using System.Text; using Avro.Generic; using Avro.IO; using Avro.Specific; using com.foo; namespace Avro.perf { class Program { static void Main(string[] args) { Console.Out.WriteLine("type\timpl\taction\ttotal_items\tbatches\tbatch_size\ttime(ms)"); PerfTest( "simple", BuildSimple(), Simple._SCHEMA); PerfTest( "complex", BuildComplex(), Complex._SCHEMA); PerfTest( "narrow", BuildNarrow(), Narrow._SCHEMA); PerfTest( "wide", BuildWide(), Wide._SCHEMA); } private static Simple BuildSimple() { var bytes = "bytes sample text"; var encoding = new UTF8Encoding(); var simp = new Simple { myInt = 1, myLong = 2, myBool = true, myDouble = (double) 3, myFloat = (float) 4.5, myBytes = encoding.GetBytes( bytes ), myString = "Hello", myNull = null, }; return simp; } private static Complex BuildComplex() { var bytes = "bytes sample text"; var encoding = new UTF8Encoding(); var c = new Complex { myUInt = 1, myULong = 2, myUBool = true, myUDouble = (double) 3, myUFloat = (float) 4.5, myUBytes = encoding.GetBytes( bytes ), myUString = "Hello", myInt = 1, myLong = 2, myBool = true, myDouble = (double) 3, myFloat = (float) 4.5, myBytes = encoding.GetBytes( bytes ), myString = "Hello", myNull = null, myFixed = new MyFixed() { Value = encoding.GetBytes( "My fixed record0" ) }, myA = new A() { f1 = 10 }, myE = com.foo.MyEnum.C }; c.myArray = new List(); c.myArray.Add( encoding.GetBytes( "a" ) ); c.myArray2 = new List(); var rec = new com.foo.newRec(); rec.f1 = 50; c.myArray2.Add( rec ); c.myMap = new Dictionary(); c.myMap.Add( "key", "value" ); c.myMap2 = new Dictionary(); var newrec = new com.foo.newRec(); newrec.f1 = 1200; c.myMap2.Add( "A", newrec ); c.myObject = c.myA; var o1 = new List(); o1.Add( (double) 1123123121 ); o1.Add( (double) 2 ); o1.Add( null ); o1.Add( "fred" ); var o2 = new List(); o2.Add( (double) 1 ); o2.Add( (double) 32531 ); o2.Add( (double) 4 ); o2.Add( (double) 555 ); o2.Add( (double) 0 ); c.myArray3 = new List>(); c.myArray3.Add( o1 ); c.myArray3.Add( o2 ); return c; } private static Narrow BuildNarrow() { return new Narrow { myInt = 5000000, myLong = 99999999999, myString = "narrow" }; } private static Wide BuildWide() { return new Wide() { myA = new A { f1 = 9995885 }, myA2 = new A { f1 = 29995885 }, myA3 = new A { f1 = 39995885 }, myA4 = new A { f1 = 49995885 }, myFloat = 11111.11f, myFloat2 = 22222.22f, myFloat3 = 33333.33f, myFloat4 = 44444.44f, myE = MyEnum.A, myE2 = MyEnum.B, myE3 = MyEnum.C, myE4 = MyEnum.C, myBool = true, myBool2 = false, myBool3 = true, myBool4 = false, myDouble = 11111111111.11, myDouble2 = 22222222222.22, myDouble3 = 33333333333.33, myDouble4 = 44444444444.44, myInt = 1111111, myInt2 = 2222222, myInt3 = 3333333, myInt4 = 4444444, myLong = 1111111111111, myLong2 = 2222222222222, myLong3 = 3333333333333, myLong4 = 4444444444444, myString = "wide record 1", myString2 = "wide record 2", myString3 = "wide record 3", myString4 = "wide record 4", myBytes = new byte[] { 1, 1, 1, 1 }, myBytes2 = new byte[] { 2, 2, 2, 2 }, myBytes3 = new byte[] { 3, 3, 3, 3 }, myBytes4 = new byte[] { 4, 4, 4, 4 } }; } private static void PerfTest(string testName, T testObj, Schema schema) { var generic = ConvertSpecificToGeneric(testObj, schema); PerfTest(testName, "default_specific", testObj, schema, s => new SpecificWriter(s), s => new SpecificReader(s, s)); PerfTest(testName, "preresolved_specific", testObj, schema, s => new SpecificDatumWriter(s), s => new SpecificDatumReader(s, s)); PerfTest(testName, "default_generic", generic, schema, s => new GenericWriter(s), s => new GenericReader(s, s)); PerfTest(testName, "preresolved_generic", generic, schema, s => new GenericDatumWriter(s), s => new GenericDatumReader(s, s)); } private static GenericRecord ConvertSpecificToGeneric(T obj, Schema schema) { var stream = new MemoryStream(); var encoder = new BinaryEncoder( stream ); var decoder = new BinaryDecoder( stream ); var writer = new SpecificWriter(schema); writer.Write(obj, encoder); encoder.Flush(); stream.Position = 0; return new GenericReader(schema, schema).Read(null, decoder); } private static void PerfTest(string name, string impl, T z, Schema schema, Func> writerFactory, Func> readerFactory) { var stream = new MemoryStream(); var binEncoder = new BinaryEncoder( stream ); var decoder = new BinaryDecoder( stream ); var totalItems = 1000000; foreach (int itemsPerBatch in new List { 1000 } ) { int serialized = 0; int batches = totalItems / itemsPerBatch; var startTime = Environment.TickCount; for (int batch = 0; batch < batches; batch++ ) { var writer = writerFactory( schema ); for( int i = 0; i < itemsPerBatch; i++ ) { stream.Position = 0; writer.Write( z, binEncoder ); serialized++; } } Console.Out.WriteLine("{0}\t{1}\tserialize\t{2}\t{3}\t{4}\t{5}", name, impl, serialized, batches, itemsPerBatch, Environment.TickCount - startTime); int deserialized = 0; startTime = Environment.TickCount; for (int batch = 0; batch < batches; batch++ ) { var reader = readerFactory(schema); for (int i = 0; i < itemsPerBatch; i++) { stream.Position = 0; reader.Read( z, decoder ); deserialized++; } } Console.Out.WriteLine("{0}\t{1}\tdeserialize\t{2}\t{3}\t{4}\t{5}", name, impl, deserialized, batches, itemsPerBatch, Environment.TickCount - startTime); } } } }