示例#1
0
        protected TResult Run(TJob job, int index)
        {
            if (WithConsole && WithConsolePreview && job is IPreviewableBenchmarkJob <TResult> previewableJob)
            {
                previewableJob.OnPreview += (previewResult) =>
                {
                    lock (BenchmarkTableOutput)
                    {
                        BenchmarkTableOutput.PreviewRow(previewResult, index);
                    }
                };
            }

            var result = job.Execute();

            if (WithConsole && WithConsolePreview)
            {
                lock (BenchmarkTableOutput)
                {
                    BenchmarkTableOutput.PreviewRow(result, index);
                }
            }

            return(result);
        }
示例#2
0
        /// <summary>
        /// Executes a benchmark of given jobs with a given name.
        /// </summary>
        /// <remarks>
        /// Jobs are executed in the threadpool and must be therefore thread-safe.
        /// </remarks>
        /// <param name="jobs">Jobs to be benchmarked.</param>
        /// <param name="name">Optional name of the benchmark.</param>
        public override List <TResult> Run(TJob[] jobs, string name = null)
        {
            BenchmarkStarted(name);

            var results = new TResult[jobs.Length];
            var tasks   = new Task[jobs.Length];

            if (WithConsole && WithConsolePreview)
            {
                for (var i = 0; i < jobs.Length; i++)
                {
                    Console.WriteLine(" Not yet executed");
                }

                Console.SetCursorPosition(0, Console.CursorTop - jobs.Length);
            }

            var dummyArray  = new int[jobs.Length];
            var partitioner = Partitioner.Create(dummyArray, EnumerablePartitionerOptions.NoBuffering);

            Parallel.ForEach(partitioner, new ParallelOptions {
                MaxDegreeOfParallelism = maxDegreeOfParallelism
            }, (input, state, i) =>
            {
                var result = Run(jobs[i], (int)i);

                lock (results)
                {
                    results[i] = result;
                }
            });

            foreach (var result in results)
            {
                BenchmarkTableOutput.PrintRow(result, TextWritersArray);
            }

            foreach (var textWriter in TextWritersArray)
            {
                textWriter.Flush();
            }

            BenchmarkEnded();

            return(results.ToList());
        }