Пример #1
0
        internal Window(TCursor cursor, TKey width, Lookup lookup) : this()
        {
            if (cursor.IsIndexed)
            {
                throw new NotSupportedException("Window is not supported for indexed series, only for sorted ones.");
            }
            var op     = new WindowOnlineOp <TKey, TValue, TCursor>();
            var spanOp =
                new SpanOp <TKey, TValue, Range <TKey, TValue, TCursor>,
                            TCursor, WindowOnlineOp <TKey, TValue, TCursor> >(width, lookup, op, cursor.Comparer);

            _cursor =
                new SpanOpImpl <TKey, TValue,
                                Range <TKey, TValue, TCursor>,
                                SpanOp <TKey, TValue, Range <TKey, TValue, TCursor>, TCursor, WindowOnlineOp <TKey, TValue, TCursor>
                                        >,
                                TCursor
                                >(cursor, spanOp);
        }
Пример #2
0
        internal Window(TCursor cursor, int count, bool allowIncomplete = false) : this()
        {
            if (cursor.IsIndexed)
            {
                throw new NotSupportedException("Window is not supported for indexed series, only for sorted ones.");
            }
            if (count <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(count));
            }

            var op     = new WindowOnlineOp <TKey, TValue, TCursor>();
            var spanOp =
                new SpanOp <TKey, TValue, Range <TKey, TValue, TCursor>,
                            TCursor, WindowOnlineOp <TKey, TValue, TCursor> >(count, allowIncomplete, op, cursor.Comparer);

            _cursor =
                new SpanOpImpl <TKey, TValue,
                                Range <TKey, TValue, TCursor>,
                                SpanOp <TKey, TValue, Range <TKey, TValue, TCursor>, TCursor, WindowOnlineOp <TKey, TValue, TCursor>
                                        >,
                                TCursor
                                >(cursor, spanOp);
        }
Пример #3
0
        public void WindowDirectAndIndirectSpanOpBenchmark()
        {
            Settings.DoAdditionalCorrectnessChecks = false;

            var count = 100000;
            var width = 20;
            var sm    = new SortedMap <int, double>();

            sm.Add(0, 0); // make irregular, it's faster but more memory
            for (int i = 2; i <= count; i++)
            {
                sm.Add(i, i);
            }

            var op     = new WindowOnlineOp <int, double, SortedMapCursor <int, double> >();
            var spanOp =
                new SpanOpCount <int, double, Range <int, double, SortedMapCursor <int, double> >,
                                 SortedMapCursor <int, double>, WindowOnlineOp <int, double, SortedMapCursor <int, double> > >(20, false,
                                                                                                                               op);
            var window =
                new SpanOpImpl <int,
                                double,
                                Range <int, double, SortedMapCursor <int, double> >,
                                SpanOpCount <int, double, Range <int, double, SortedMapCursor <int, double> >, SortedMapCursor <int, double>, WindowOnlineOp <int, double, SortedMapCursor <int, double> > >,
                                SortedMapCursor <int, double>
                                >(sm.GetEnumerator(), spanOp).Source
                .Map(x =>
            {
                var sum = 0.0;
                var c   = 0;
                foreach (var keyValuePair in x.Source)
                {
                    sum += keyValuePair.Value;
                    c++;
                }
                return(sum / c);        // x.CursorDefinition.Count TODO
            });

            var spanOpCombined =
                new SpanOp <int, double, Range <int, double, SortedMapCursor <int, double> >,
                            SortedMapCursor <int, double>, WindowOnlineOp <int, double, SortedMapCursor <int, double> > >(20, false,
                                                                                                                          op, sm.comparer);
            var windowCombined =
                new SpanOpImpl <int,
                                double,
                                Range <int, double, SortedMapCursor <int, double> >,
                                SpanOp <int, double, Range <int, double, SortedMapCursor <int, double> >, SortedMapCursor <int, double>, WindowOnlineOp <int, double, SortedMapCursor <int, double> > >,
                                SortedMapCursor <int, double>
                                >(sm.GetEnumerator(), spanOpCombined).Source
                .Map(x =>
            {
                var sum = 0.0;
                var c   = 0;
                foreach (var keyValuePair in x.Source)
                {
                    sum += keyValuePair.Value;
                    c++;
                }
                return(sum / c);    // x.CursorDefinition.Count TODO
            });

            var windowExtension = sm.Window(width).Map(x =>
            {
                var sum = 0.0;
                var c   = 0;
                foreach (var keyValuePair in x)
                {
                    sum += keyValuePair.Value;
                    c++;
                }
                return(sum / c); // x.CursorDefinition.Count TODO
            });

            for (int round = 0; round < 20; round++)
            {
                double sum1 = 0.0;
                using (Benchmark.Run("Window SpanOpCount", count * width))
                {
                    foreach (var keyValuePair in window)
                    {
                        sum1 += keyValuePair.Value;
                    }
                }

                double sum2 = 0.0;
                using (Benchmark.Run("Window SpanOp", count * width))
                {
                    foreach (var keyValuePair in windowCombined)
                    {
                        sum2 += keyValuePair.Value;
                    }
                }

                double sum3 = 0.0;
                using (Benchmark.Run("Window Extension", count * width))
                {
                    foreach (var keyValuePair in windowExtension)
                    {
                        sum3 += keyValuePair.Value;
                    }
                }

                Assert.AreEqual(sum1, sum2);
                Assert.AreEqual(sum1, sum3);
            }

            Benchmark.Dump($"The window width is {width}.");
        }