예제 #1
0
        private static async Task GetEnumerableStreamBenchmarkAsync(TimeSpan timeout)
        {
            using (var db = new SqlLocalDB())
            {
                var es = new SqlEventStore(db.ConnectionString);

                await es.Database.InitializeAsync();

                await es.WithBulkCopyAppend().AppendAsync(GetUncommittedSource(1000, 100000));

                var streamIdSet = es.GetEnumerable().Select(x => x.StreamId).Distinct().ToList();

                //

                var fs = new[] {
                    "default",
                    "unknown",
                };

                var xs = new[] {
                    new List <double>(),
                    new List <double>(),
                };

                for (int k = 0; k < 10; k++)
                {
                    var i = 0;
                    foreach (var f in new Func <ISqlEventStore, ISqlEventStore>[] {
                        x => x,
                    })
                    {
                        var y = f(es);

                        var sw = new Stopwatch();

                        var rnd = Randomness.Create();

                        int n = 0;
                        while (sw.Elapsed < timeout)
                        {
                            var streamId = streamIdSet[rnd.Next(streamIdSet.Count)];

                            var minSeq = 1;
                            var maxSeq = minSeq + rnd.Next(100);

                            sw.Start();

                            n += y.GetEnumerableStream(streamId, minSeq, maxSeq).Count();

                            sw.Stop();
                        }

                        var p = n / sw.Elapsed.TotalSeconds;
                        xs[i].Add(p);
                        i++;
                    }

                    Console.Write($"{k}");

                    for (int j = 0; j < 2; j++)
                    {
                        var p = xs[j][k];

                        var fit = Tuple.Create(0d, 0d);

                        if (xs[j].Count > 1)
                        {
                            fit = Fit.Line(Enumerable.Range(1, xs[j].Count).Select(x => (double)x).ToArray(), xs[j].ToArray());
                        }

                        Console.Write($" | {fs[j]}: {p,9:N1} op/s {fit.Item1,9:N1}+x*{fit.Item2,9:N1}");
                    }
                    Console.WriteLine();
                }
            }
        }