예제 #1
0
        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));
        }
예제 #2
0
        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));
        }
예제 #3
0
        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();
        }
예제 #4
0
        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");
            }
        }
예제 #5
0
        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();
        }