static void BenchmarkWithConfig(int repeat, YcsbConfig config)
        {
            List <BenchResult> results = new List <BenchResult>(repeat);

            for (int i = 0; i < repeat; ++i)
            {
                if (repeat > 1)
                {
                    Console.WriteLine($"ROUND {i + 1}:");
                }
                BenchResult result = BenchmarkWithConfigOnce(config);
                results.Add(result);
                result.Print();
            }
            PrintAverageResult(results);
            Console.WriteLine("---");
        }
            public IEnumerable <YcsbConfig> GetConfigs()
            {
                YcsbConfig config = new YcsbConfig();

                config.Dist           = this.Dist;
                config.RecordCount    = this.RecordCount;
                config.WorkerWorkload = this.WorkerWorkload;
                config.QueriesPerTx   = this.QueryPerTx;
                foreach (double skew in this.ZipfSkews)
                {
                    config.ZipfSkew = skew;
                    foreach (double rr in this.ReadRatios)
                    {
                        config.ReadRatio = rr;
                        foreach (int c in this.Concurrencies)
                        {
                            config.Concurrency = c;
                            yield return(config);
                        }
                    }
                }
            }
        static BenchResult BenchmarkWithConfigOnce(YcsbConfig config)
        {
            // config.Print();
            // Console.WriteLine();
            var versionDb = YcsbHelper.MakeVersionDb(config.Concurrency);

            // Console.Write("loading data... ");
            LoadYcsbData(versionDb, config.RecordCount);
            // Console.WriteLine("done");
            var generator = new YCSBDataGenerator(
                config.RecordCount, config.ReadRatio,
                config.Dist, config.ZipfSkew);
            Func <TransactionExecution, YcsbWorker> workerFactory =
                txExec => YcsbWorker.Generate(
                    config.WorkerWorkload, config.QueriesPerTx, generator, txExec);
            // Console.Write("generate workload... ");
            var benchmark = new YcsbBenchmarkEnv(versionDb, workerFactory);
            // Console.WriteLine("done");
            var result = benchmark.Go();

            SingletonVersionDb.DestroyInstance();
            return(result);
        }