static void Bench(object data, ITranscoder transcoder, int repeat) { // warmup and copy var item = transcoder.Serialize(data); var ___ = transcoder.Deserialize(item); var comparer = System.Collections.StructuralComparisons.StructuralEqualityComparer; if (!comparer.Equals(data, ___)) { throw new Exception("failed"); } var items = Enumerable.Range(0, repeat).Select(_ => { return(new CacheItem(item.Flags, new ArraySegment <byte>(item.Data.Array.ToArray(), item.Data.Offset, item.Data.Count))); }).ToArray(); GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); var sw = Stopwatch.StartNew(); for (int i = 0; i < repeat; i++) { var _ = transcoder.Serialize(data); } sw.Stop(); Console.WriteLine("S " + transcoder.GetType().Name + ":" + (int)sw.Elapsed.TotalMilliseconds); sw.Restart(); foreach (var x in items) { var _ = transcoder.Deserialize(x); } sw.Stop(); Console.WriteLine("D " + transcoder.GetType().Name + ":" + (int)sw.Elapsed.TotalMilliseconds); Console.WriteLine("Size:" + item.Data.Count); }
object ITranscoder.Deserialize(CacheItem item) { switch (item.Flags) { case ProtoIdentifier: var segment = item.Data; byte[] raw = segment.Array; int count = segment.Count, offset = segment.Offset; Type type = ReadType(raw, ref offset, ref count); using (var ms = new MemoryStream(raw, offset, count)) { return(ProtoBuf.Serializer.NonGeneric.Deserialize(type, ms)); } default: return(inner.Deserialize(item)); } }
object ITranscoder.Deserialize(CacheItem item) { switch (item.Flags) { case ProtoIdentifier: var segment = item.Data; byte[] raw = segment.Array; int count = segment.Count, offset = segment.Offset; Type type = ReadType(raw, ref offset, ref count); using (var ms = new MemoryStream(raw, offset, count)) { Interlocked.Increment(ref deserializedCount); return(model.Deserialize(ms, null, type)); } default: return(inner.Deserialize(item)); } }
static void Bench(object data, ITranscoder transcoder, int repeat) { // warmup and copy var item = transcoder.Serialize(data); var ___ = transcoder.Deserialize(item); var comparer = System.Collections.StructuralComparisons.StructuralEqualityComparer; if (!comparer.Equals(data, ___)) throw new Exception("failed"); var items = Enumerable.Range(0, repeat).Select(_ => { return new CacheItem(item.Flags, new ArraySegment<byte>(item.Data.Array.ToArray(), item.Data.Offset, item.Data.Count)); }).ToArray(); GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); var sw = Stopwatch.StartNew(); for (int i = 0; i < repeat; i++) { var _ = transcoder.Serialize(data); } sw.Stop(); Console.WriteLine("S " + transcoder.GetType().Name + ":" + (int)sw.Elapsed.TotalMilliseconds); sw.Restart(); foreach (var x in items) { var _ = transcoder.Deserialize(x); } sw.Stop(); Console.WriteLine("D " + transcoder.GetType().Name + ":" + (int)sw.Elapsed.TotalMilliseconds); Console.WriteLine("Size:" + item.Data.Count); }