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); }
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); }
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}."); }