public static void EquiJoinStreamableTest(IPerfTestState state)
        {
            const int LeftSize     = 1000000;
            const int GroupingSize = 10;
            const int RightSize    = LeftSize * GroupingSize;
            const int NumTests     = 20;
            var       pool         = new MemoryPool <Empty, int>();

            state.Action = "creating input data...";
            var input1 = CreateSequentialStreamable(LeftSize, pool);
            var input2 = CreateSequentialStreamable(RightSize, pool);

            for (int j = 1; j <= NumTests; j++)
            {
                state.Action = string.Format("running {0}/{1}...", j, NumTests);

                var timer = new Stopwatch();
                timer.Start();
                var output      = input1.Join(input2, l => l, r => r / GroupingSize, (l, r) => l);
                int outputCount = 0;
                output.ToStreamMessageObservable().ForEachAsync(b => outputCount += b.Count).Wait();
                timer.Stop();

                state.AddResult(LeftSize + RightSize, outputCount, timer.Elapsed);
            }

            state.Action = "DONE";
        }
        public static void EquiJoinStreamableTest(IPerfTestState state)
        {
            const int LeftSize     = 1_000_000;
            const int GroupingSize = 10;
            const int RightSize    = LeftSize * GroupingSize;
            const int NumTests     = 20;
            var       pool         = new MemoryPool <Empty, int>();

            state.Action = "creating input data...";
            var leftInputData  = CreateInputData(LeftSize, pool);
            var rightInputData = CreateInputData(RightSize, pool);

            for (int j = 1; j <= NumTests; j++)
            {
                state.Action = string.Format("running {0}/{1}...", j, NumTests);

                // Clone input sources to new streamables for this iteration's query
                var leftInputStreamable  = CloneInputToStreamable(leftInputData);
                var rightInputStreamable = CloneInputToStreamable(rightInputData);

                // Setup query
                var output      = leftInputStreamable.Join(rightInputStreamable, l => l, r => r / GroupingSize, (l, r) => l);
                int outputCount = 0;

                // Process Data
                var timer = new Stopwatch();
                timer.Start();
                output.ToStreamMessageObservable().ForEachAsync(b => outputCount += b.Count).Wait();
                timer.Stop();

                state.AddResult(LeftSize + RightSize, outputCount, timer.Elapsed);
            }

            state.Action = "DONE";
        }