public static PerformanceResult RunConcurrentPerformanceTest(int numIterations, int degreeParallelism,
            Action operation)
        {
            int i;
            var taskList = new Task<PerformanceResult>[degreeParallelism];
            long startTime = HiResTimer.Ticks;
            int subIterations = numIterations/degreeParallelism;

            for (i = 0; i < degreeParallelism; i++)
            {
                var t = new Task<PerformanceResult>(() => RunPerformanceTest(subIterations, operation, true));
                taskList[i] = t;
            }

            for (i = 0; i < degreeParallelism; i++) taskList[i].Start();

            Task.WaitAll(taskList);
            long stopTime = HiResTimer.Ticks;

            var rawData = new List<double>();

            for (i = 0; i < degreeParallelism; i++)
            {
                rawData.AddRange(taskList[i].Result.DescriptiveResult.RawData);
            }

            var desc = new DescriptiveAnalysis(rawData);
            desc.Analyze(false);
            desc.AnalyzeHistogram(cHistogramBuckets);

            var res = new PerformanceResult
            {
                IsValid = true,
                Iterations = taskList.Sum(p => p.Result.Iterations),
                DegreeOfParallelism = degreeParallelism,
                TotalMilliseconds = ConvertToMs(startTime, stopTime),
                TotalSeconds = ConvertToSeconds(startTime, stopTime),
                TotalTicks = stopTime - startTime,
                DescriptiveResult = desc.Result
            };

            for (i = 0; i < degreeParallelism; i++) taskList[i].Dispose();

            return res;
        }
        public static PerformanceResult RunConcurrentPerformanceTest(int numIterations, int degreeParallelism,
            Func<bool> operation)
        {
            int i;
            var taskList = new Task<PerformanceResult>[degreeParallelism];

            int subIterations = numIterations/degreeParallelism;

            for (i = 0; i < degreeParallelism; i++)
            {
                var t = new Task<PerformanceResult>(() => RunPerformanceTest(subIterations, operation, true));
                taskList[i] = t;
            }

            for (i = 0; i < degreeParallelism; i++) taskList[i].Start();

            Task.WaitAll(taskList);

            var rawData = new List<double>();
            bool valid = true;

            for (i = 0; i < degreeParallelism; i++)
            {
                valid &= taskList[i].Result.IsValid;
                rawData.AddRange(taskList[i].Result.DescriptiveResult.RawData);
            }

            var desc = new DescriptiveAnalysis(rawData);
            desc.Analyze(false);
            desc.AnalyzeHistogram(cHistogramBuckets);

            var res = new PerformanceResult
                      {
                          IsValid = valid,
                          TotalMilliseconds = taskList.Max(p => p.Result.TotalMilliseconds),
                          TotalSeconds = taskList.Max(p => p.Result.TotalSeconds),
                          TotalTicks = taskList.Max(p => p.Result.TotalTicks),
                          DescriptiveResult = desc.Result
                      };

            for (i = 0; i < degreeParallelism; i++) taskList[i].Dispose();

            return res;
        }
        private void RunSITests()
        {
            _dictResult = PerformancePatterns.RunPerformanceTest(cMinPerfIterations,
                (() =>
                {
                    var ndx = _intKeys[_rng.Next(0, _intKeys.Count)];
                    string desc;

                    DataRow[] rows = _intDataTable.Select(String.Format("codeColumn = {0}", ndx));
                    if (rows.Length > 0) desc = rows[0]["valueColumn"].ToString();
                }));
            Console.WriteLine(cResultFormat + " with int-keyed DataTable.", cMinPerfIterations,
                _dictResult.TotalMilliseconds,
                _dictResult.TotalSeconds);

            _tableResult = PerformancePatterns.RunPerformanceTest(cMinPerfIterations,
                (() =>
                {
                    var ndx = _stringKeys[_rng.Next(0, _stringKeys.Count)];

                    string desc;

                    DataRow[] rows = _stringDataTable.Select("codeColumn = '" + ndx + "'");
                    if (rows.Length > 0) desc = rows[0]["valueColumn"].ToString();
                }));
            Console.WriteLine(cResultFormat + " with string-keyed DataTable.", cMinPerfIterations,
                _tableResult.TotalMilliseconds,
                _tableResult.TotalSeconds);
        }
        private void RunStringTests()
        {
            _dictResult = PerformancePatterns.RunPerformanceTest(cMinPerfIterations,
                (() =>
                {
                    var ndx = _stringKeys[_rng.Next(0, _stringKeys.Count)];
                    string desc;
                    _dictionary.TryGetValue(ndx, out desc);
                }));
            Console.WriteLine(cResultFormat + " with dictionary.", cMinPerfIterations, _dictResult.TotalMilliseconds,
                _dictResult.TotalSeconds);
            _tableResult = PerformancePatterns.RunPerformanceTest(cMinPerfIterations,
                (() =>
                {
                    var ndx = _stringKeys[_rng.Next(0, _stringKeys.Count)];

                    string desc;

                    DataRow[] rows = _stringDataTable.Select("codeColumn = '" + ndx + "'");
                    if (rows.Length > 0) desc = rows[0]["valueColumn"].ToString();
                }));
            Console.WriteLine(cResultFormat + " with DataTable.", cMinPerfIterations, _tableResult.TotalMilliseconds,
                _tableResult.TotalSeconds);
        }
 public void PrintResult(PerformanceResult res)
 {
     Console.WriteLine(res.ToString());
 }