csharptest | 27bfcc5 | 2011-06-02 12:04:06 -0500 | [diff] [blame^] | 1 | using System;
|
| 2 | using Google.ProtocolBuffers.TestProtos;
|
| 3 | using NUnit.Framework;
|
| 4 |
|
| 5 | namespace Google.ProtocolBuffers.CompatTests
|
| 6 | {
|
| 7 | public abstract class CompatibilityTests
|
| 8 | {
|
| 9 | protected abstract string TestName { get; }
|
| 10 | protected abstract object SerializeMessage<TMessage, TBuilder>(TMessage message)
|
| 11 | where TMessage : IMessageLite<TMessage, TBuilder>
|
| 12 | where TBuilder : IBuilderLite<TMessage, TBuilder>;
|
| 13 |
|
| 14 | protected abstract TBuilder DeerializeMessage<TMessage, TBuilder>(object message, TBuilder builder, ExtensionRegistry registry)
|
| 15 | where TMessage : IMessageLite<TMessage, TBuilder>
|
| 16 | where TBuilder : IBuilderLite<TMessage, TBuilder>;
|
| 17 |
|
| 18 | #region RunBenchmark
|
| 19 |
|
| 20 | protected void RunBenchmark<TMessage, TBuilder>(byte[] buffer, bool write)
|
| 21 | where TMessage : IMessageLite<TMessage, TBuilder>
|
| 22 | where TBuilder : IBuilderLite<TMessage, TBuilder>, new()
|
| 23 | {
|
| 24 | TBuilder builder = new TBuilder();
|
| 25 | TMessage message = new TBuilder().MergeFrom(buffer).Build();
|
| 26 | System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
|
| 27 | //simple warm-up
|
| 28 | object content = SerializeMessage<TMessage, TBuilder>(message);
|
| 29 | Assert.AreEqual(message, DeerializeMessage<TMessage, TBuilder>(content, new TBuilder(), ExtensionRegistry.Empty).Build());
|
| 30 | //timming
|
| 31 | long time = 0, sample = 1;
|
| 32 | while (time < 100)
|
| 33 | {
|
| 34 | sample *= 10;
|
| 35 | watch.Reset();
|
| 36 | watch.Start();
|
| 37 | if (write)
|
| 38 | {
|
| 39 | for (int i = 0; i < sample; i++)
|
| 40 | SerializeMessage<TMessage, TBuilder>(message);
|
| 41 | }
|
| 42 | else
|
| 43 | {
|
| 44 | for (int i = 0; i < sample; i++)
|
| 45 | DeerializeMessage<TMessage, TBuilder>(content, builder, ExtensionRegistry.Empty);
|
| 46 | }
|
| 47 | watch.Stop();
|
| 48 | time = watch.ElapsedMilliseconds;
|
| 49 | }
|
| 50 |
|
| 51 | ulong rounds = (ulong)((100.0 / watch.ElapsedMilliseconds) * sample);
|
| 52 | //test
|
| 53 | watch.Reset();
|
| 54 | watch.Start();
|
| 55 |
|
| 56 | if (write)
|
| 57 | {
|
| 58 | for (ulong i = 0; i < rounds; i++)
|
| 59 | SerializeMessage<TMessage, TBuilder>(message);
|
| 60 | }
|
| 61 | else
|
| 62 | {
|
| 63 | for (ulong i = 0; i < rounds; i++)
|
| 64 | DeerializeMessage<TMessage, TBuilder>(content, builder, ExtensionRegistry.Empty);
|
| 65 | }
|
| 66 |
|
| 67 | watch.Stop();
|
| 68 | System.Diagnostics.Trace.TraceInformation(
|
| 69 | "\r\n{0} {4} {5} {3:n0} rps ({1:n0} rounds in {2:n0} ms)", typeof(TMessage).Name, rounds,
|
| 70 | watch.ElapsedMilliseconds, (1000.0 / watch.ElapsedMilliseconds) * (double)rounds, TestName, write ? " write" : " read");
|
| 71 | GC.GetTotalMemory(true);
|
| 72 | GC.WaitForPendingFinalizers();
|
| 73 | }
|
| 74 |
|
| 75 | [Test]
|
| 76 | public virtual void Message1OptimizeSizeWriterPerf()
|
| 77 | {
|
| 78 | RunBenchmark<SizeMessage1, SizeMessage1.Builder>(TestResources.google_message1, true);
|
| 79 | }
|
| 80 | [Test]
|
| 81 | public virtual void Message1OptimizeSpeedWriterPerf()
|
| 82 | {
|
| 83 | RunBenchmark<SpeedMessage1, SpeedMessage1.Builder>(TestResources.google_message1, true);
|
| 84 | }
|
| 85 | [Test]
|
| 86 | public virtual void Message2OptimizeSizeWriterPerf()
|
| 87 | {
|
| 88 | RunBenchmark<SizeMessage2, SizeMessage2.Builder>(TestResources.google_message2, true);
|
| 89 | }
|
| 90 | [Test]
|
| 91 | public virtual void Message2OptimizeSpeedWriterPerf()
|
| 92 | {
|
| 93 | RunBenchmark<SpeedMessage2, SpeedMessage2.Builder>(TestResources.google_message2, true);
|
| 94 | }
|
| 95 |
|
| 96 | [Test]
|
| 97 | public virtual void Message1OptimizeSizeReadPerf()
|
| 98 | {
|
| 99 | RunBenchmark<SizeMessage1, SizeMessage1.Builder>(TestResources.google_message1, false);
|
| 100 | }
|
| 101 | [Test]
|
| 102 | public virtual void Message1OptimizeSpeedReadPerf()
|
| 103 | {
|
| 104 | RunBenchmark<SpeedMessage1, SpeedMessage1.Builder>(TestResources.google_message1, false);
|
| 105 | }
|
| 106 | [Test]
|
| 107 | public virtual void Message2OptimizeSizeReadPerf()
|
| 108 | {
|
| 109 | RunBenchmark<SizeMessage2, SizeMessage2.Builder>(TestResources.google_message2, false);
|
| 110 | }
|
| 111 | [Test]
|
| 112 | public virtual void Message2OptimizeSpeedReadPerf()
|
| 113 | {
|
| 114 | RunBenchmark<SpeedMessage2, SpeedMessage2.Builder>(TestResources.google_message2, false);
|
| 115 | }
|
| 116 |
|
| 117 | #endregion
|
| 118 |
|
| 119 | [Test]
|
| 120 | public virtual void RoundTripMessage1OptimizeSize()
|
| 121 | {
|
| 122 | SizeMessage1 msg = SizeMessage1.CreateBuilder().MergeFrom(TestResources.google_message1).Build();
|
| 123 | object content = SerializeMessage<SizeMessage1, SizeMessage1.Builder>(msg);
|
| 124 |
|
| 125 | SizeMessage1 copy = DeerializeMessage<SizeMessage1, SizeMessage1.Builder>(content, SizeMessage1.CreateBuilder(), ExtensionRegistry.Empty).Build();
|
| 126 |
|
| 127 | Assert.AreEqual(msg, copy);
|
| 128 | Assert.AreEqual(content, SerializeMessage<SizeMessage1,SizeMessage1.Builder>(copy));
|
| 129 | Assert.AreEqual(TestResources.google_message1, copy.ToByteArray());
|
| 130 | }
|
| 131 |
|
| 132 | [Test]
|
| 133 | public virtual void RoundTripMessage2OptimizeSize()
|
| 134 | {
|
| 135 | SizeMessage2 msg = SizeMessage2.CreateBuilder().MergeFrom(TestResources.google_message2).Build();
|
| 136 | object content = SerializeMessage<SizeMessage2, SizeMessage2.Builder>(msg);
|
| 137 |
|
| 138 | SizeMessage2 copy = DeerializeMessage<SizeMessage2, SizeMessage2.Builder>(content, SizeMessage2.CreateBuilder(), ExtensionRegistry.Empty).Build();
|
| 139 |
|
| 140 | Assert.AreEqual(msg, copy);
|
| 141 | Assert.AreEqual(content, SerializeMessage<SizeMessage2, SizeMessage2.Builder>(copy));
|
| 142 | Assert.AreEqual(TestResources.google_message2, copy.ToByteArray());
|
| 143 | }
|
| 144 |
|
| 145 | [Test]
|
| 146 | public virtual void RoundTripMessage1OptimizeSpeed()
|
| 147 | {
|
| 148 | SpeedMessage1 msg = SpeedMessage1.CreateBuilder().MergeFrom(TestResources.google_message1).Build();
|
| 149 | object content = SerializeMessage<SpeedMessage1, SpeedMessage1.Builder>(msg);
|
| 150 |
|
| 151 | SpeedMessage1 copy = DeerializeMessage<SpeedMessage1, SpeedMessage1.Builder>(content, SpeedMessage1.CreateBuilder(), ExtensionRegistry.Empty).Build();
|
| 152 |
|
| 153 | Assert.AreEqual(msg, copy);
|
| 154 | Assert.AreEqual(content, SerializeMessage<SpeedMessage1, SpeedMessage1.Builder>(copy));
|
| 155 | Assert.AreEqual(TestResources.google_message1, copy.ToByteArray());
|
| 156 | }
|
| 157 |
|
| 158 | [Test]
|
| 159 | public virtual void RoundTripMessage2OptimizeSpeed()
|
| 160 | {
|
| 161 | SpeedMessage2 msg = SpeedMessage2.CreateBuilder().MergeFrom(TestResources.google_message2).Build();
|
| 162 | object content = SerializeMessage<SpeedMessage2, SpeedMessage2.Builder>(msg);
|
| 163 |
|
| 164 | SpeedMessage2 copy = DeerializeMessage<SpeedMessage2, SpeedMessage2.Builder>(content, SpeedMessage2.CreateBuilder(), ExtensionRegistry.Empty).Build();
|
| 165 |
|
| 166 | Assert.AreEqual(msg, copy);
|
| 167 | Assert.AreEqual(content, SerializeMessage<SpeedMessage2, SpeedMessage2.Builder>(copy));
|
| 168 | Assert.AreEqual(TestResources.google_message2, copy.ToByteArray());
|
| 169 | }
|
| 170 |
|
| 171 | }
|
| 172 | }
|