public unsafe void CouldSerializeSortedMap2() { var rng = new Random(); var dest = (Memory <byte>) new byte[1000000]; var buffer = dest; var handle = buffer.Pin(); var ptr = (IntPtr)handle.Pointer; var sm = new MutableSeries <int, int>(); for (var i = 0; i < 10000; i++) { sm.Add(i, i); } var len = BinarySerializer.SizeOf(sm, out var temp); var len2 = BinarySerializer.Write(sm, buffer.Span, temp); Assert.AreEqual(len, len2); Console.WriteLine($"Useful: {sm.RowCount * 8}"); Console.WriteLine($"Total: {len}"); // NB interesting that with converting double to decimal savings go from 65% to 85%, // even calculated from (8+8) base size not decimal's 16 size Console.WriteLine($"Savings: {1.0 - ((len * 1.0) / (sm.RowCount * 8.0))}"); Series <int, int> sm2 = null; var len3 = BinarySerializer.Read(buffer.Span, out sm2); Assert.AreEqual(len, len3); Assert.IsTrue(sm2.Keys.SequenceEqual(sm.Keys)); Assert.IsTrue(sm2.Values.SequenceEqual(sm.Values)); }
public unsafe void CouldSerializeRegularSortedMapWithZstd() { var rng = new Random(); var dest = (Memory <byte>) new byte[1000000]; var buffer = dest; var handle = buffer.Pin(); var ptr = (IntPtr)handle.Pointer; var sm = new MutableSeries <DateTime, decimal>(); for (var i = 0; i < 1000; i++) { sm.Add(DateTime.Today.AddSeconds(i), (decimal)Math.Round(i + rng.NextDouble(), 2)); } var sizeOf = BinarySerializer.SizeOf(sm, out var tmp); var written = BinarySerializer.Write(sm, dest.Span, tmp); Assert.AreEqual(sizeOf, written); Console.WriteLine($"Useful: {sm.RowCount * 24}"); Console.WriteLine($"Total: {written}"); // NB interesting that with converting double to decimal savings go from 65% to 85%, // even calculated from (8+8) base size not decimal's 16 size Console.WriteLine($"Savings: {1.0 - ((written * 1.0) / (sm.RowCount * 24.0))}"); Series <DateTime, decimal> sm2 = null; var len2 = BinarySerializer.Read(buffer.Span, out sm2); Assert.AreEqual(written, len2); Assert.IsTrue(sm2.Keys.SequenceEqual(sm.Keys)); Assert.IsTrue(sm2.Values.SequenceEqual(sm.Values)); }
public void EnumerateScmSpeed() { const int count = 10_000_000; var sl = new SortedList <int, int>(); var sm = new MutableSeries <int, int>(); for (int i = 0; i < count; i++) { if (i % 1000 != 0) { sl.Add(i, i); sm.Add(i, i); //scm.Add(i, i); } } sm.MarkReadOnly(); // scm.Complete(); for (int r = 0; r < 20; r++) { //var sum1 = 0L; //using (Benchmark.Run("SL", count)) //{ // using (var c = sl.GetEnumerator()) // { // while (c.MoveNext()) // { // sum1 += c.Current.Value; // } // } //} //Assert.True(sum1 > 0); var sum2 = 0L; using (Benchmark.Run("SM Current.Value", count)) { using (var c = sm.GetEnumerator()) { while (c.MoveNext()) { sum2 += c.Current.Value; } } } //Assert.AreEqual(sum1, sum2); var sum3 = 0L; using (Benchmark.Run("SM CurrentValue", count)) { using (var c = sm.GetEnumerator()) { while (c.MoveNext()) { sum3 += c.CurrentValue; } } } //Assert.AreEqual(sum1, sum3); //var sum4 = 0L; //using (Benchmark.Run("SCM Current.Value", count)) //{ // using (var c = scm.GetEnumerator()) // { // while (c.MoveNext()) // { // sum4 += c.Current.Value; // } // } //} //Assert.AreEqual(sum1, sum4); //var sum5 = 0L; //using (Benchmark.Run("SCM CurrentValue", count)) //{ // using (var c = scm.GetEnumerator()) // { // while (c.MoveNext()) // { // sum5 += c.CurrentValue; // } // } //} //Assert.AreEqual(sum1, sum5); } Benchmark.Dump(); }
public void TGVSpeed() { for (int size = 0; size < 3; size++) { var count = (int)(1024 * Math.Pow(2, size)); const int mult = 1000; var sl = new SortedList <DateTime, int>(); var sm = new MutableSeries <DateTime, int>(); var start = DateTime.Today.ToUniversalTime(); for (int i = 0; i < count; i++) { if (i != 2) // make irregular { sl.Add(start.AddTicks(i), i); sm.Add(start.AddTicks(i), i); } } Assert.IsFalse(sm.IsCompleted); sm.MarkReadOnly(); Assert.IsTrue(sm.IsCompleted); for (int r = 0; r < 20; r++) { //var sum1 = 0L; //using (Benchmark.Run("SL", count * mult, true)) //{ // for (int j = 0; j < mult; j++) // { // for (int i = 0; i < count; i++) // { // if (sl.TryGetValue(start.AddTicks(i), out var v)) // { // sum1 += v; // } // } // } //} //Assert.True(sum1 > 0); var sum2 = 0L; using (Benchmark.Run("SM", count * mult, true)) { for (int j = 0; j < mult; j++) { for (int i = 0; i < count; i++) { if (sm.TryGetValue(start.AddTicks(i), out var v)) { sum2 += v; } } } } //Assert.True(sum2 > 0); //Assert.AreEqual(sum1, sum2); //var sum3 = 0L; //using (Benchmark.Run("SCM", count * mult, true)) //{ // for (int j = 0; j < mult; j++) // { // for (int i = 0; i < count; i++) // { // if (scm.TryGetValue(start.AddTicks(i), out var v)) // { // sum3 += v; // } // } // } //} //Assert.True(sum3 > 0); //Assert.AreEqual(sum2, sum3); } Benchmark.Dump($"Size = {Math.Pow(2, size)}k elements"); } }
public void CouldMoveNextBench() { var count = 1000_000; var rounds = 20; var mult = 1_00; var bcImm = CreateIntBaseContainer(count, count); bcImm.Flags = new Flags((byte)Mutability.ReadOnly | (byte)KeySorting.Strong); var bcMut = CreateIntBaseContainer(count, count); bcMut.Flags = new Flags((byte)Mutability.Mutable | (byte)KeySorting.Strong); BlockCursor <int, object, BaseContainer <int> >[] useMut = new BlockCursor <int, object, BaseContainer <int> > [count]; var rng = new Random(42); var sm = new MutableSeries <int, int>(); var sl = new SortedList <int, int>(count); for (int i = 0; i < count; i++) { var x = rng.NextDouble(); // if ((i & 1) == 0) // this is perfectly predicted on i7-8700, give ~300 MOPS if (x > 0.50) // this is not predicted at all, performance drops to ~130MOPS, but if we always use the Sync implementation the perf is the same ~300 MOPS, always NoSync ~360 MOPS { useMut[i] = new BlockCursor <int, object, BaseContainer <int> >(bcMut); } else { useMut[i] = new BlockCursor <int, object, BaseContainer <int> >(bcImm); } sm.Add(i, i); sl.Add(i, i); } var series = new Series <int, int>(Enumerable.Range(0, count).ToArray(), Enumerable.Range(0, count).ToArray()); for (int r = 0; r < rounds; r++) { //MoveNextBenchBranch(useMut, count, mult); //MoveNextBenchMut(bcMut, count, mult); //MoveNextBenchImm(bcImm, count, mult); //MoveNextBenchSL(sl, count, mult); MoveNextBenchSM(sm, count, mult); // MoveNextBenchSCM(scm, count, mult); MoveNextBenchSeries(series, count, mult); } Benchmark.Dump(); bcImm.Dispose(); bcMut.Dispose(); }