private void Report(BenchmarkResultSet result, BenchmarkParameters parameters)
		{
			Output("Report for benchmark:		{0}", result.Benchmark);
			Output("Bytes:				{0:#,#;;0} kb", result.TotalBytes / 1024);
			Output("Time (seconds):			{0:00}", result.ElapsedSeconds);
			Output("Rate:				{0}", result.Rate);
			Output("Operations:			{0:#,#;;0}", result.TotalOperations);
			Output("Operations per second:		{0:#,#;;0} op/s", result.TotalOperations / result.ElapsedSeconds);
			Output("Milliseconds per op:		{0:0.00000} ms/op", result.ElapsedMilliseconds / (double)result.TotalOperations);

			if (parameters.Histogram)
			{
				Output(result.Histogram.ToString());
			}

			if (result.Messages.Count > 0)
			{
				Output("Messages:");
				for (var index = 0; index < result.Messages.Count; index++)
				{
					var message = result.Messages[index];
					Output(string.Format("{0}. {1}", index + 1, message));
				}
			}

			Output(Constants.Separator);
		}
		private async Task<BenchmarkResultSet> RunBenchmarkAsync(string benchmark, BenchmarkParameters parameters)
		{
			Debug.Assert(parameters.Method != null);

			var result = new BenchmarkResultSet(benchmark, parameters);

			var tasks = new Task<BenchmarkResult>[parameters.NumberOfThreads];
			for (var i = 0; i < parameters.NumberOfThreads; i++)
			{
				tasks[i] = parameters.Method(parameters);
			}

			await Task.WhenAll(tasks);

			for (var i = 0; i < parameters.NumberOfThreads; i++)
			{
				result.AddResult(i, tasks[i].Result);
			}

			return result;
		}