private IEnumerable <string[]> BuildPlusMinusPercentageRows( IEnumerable <CandidateMetrics[]> orderedMetricGroups, RankColumn rankColumn) { return(orderedMetricGroups.Select( orderedMetrics => { var prime = orderedMetrics.First(); return new[] { string.Empty } .Concat( orderedMetrics.Skip(1) .Select(metric => { var primeElapsedTicks = GetElapsed(prime, rankColumn).Ticks; if (primeElapsedTicks == 0) { return "NaN"; } var percentage = ((decimal)GetElapsed(metric, rankColumn).Ticks / primeElapsedTicks) - 1; return percentage.ToString("+ 0.00 %"); })) .ToArray(); })); }
public IEnumerable <Column> Create( IEnumerable <BenchmarkResult> results, RankColumn rankColumn, bool allowNesting) { var metricsByContext = CreateOrderedMetrics(results, rankColumn).ToArray(); yield return(new Column( "Context", allowNesting ? BuildNestedBenchmarkTestContextRows(metricsByContext).ToArray() : BuildBenchmarkTestContextRows(metricsByContext).ToArray(), HorizontalAlignment.Left)); yield return(new Column( "Candidate", BuildCandidateRows(metricsByContext.Select(x => x.OrderedMetrics)).ToArray(), HorizontalAlignment.Left)); yield return(new Column( "Rank", BuildRankRows(metricsByContext.Select(x => x.OrderedMetrics)).ToArray(), HorizontalAlignment.Right)); yield return(new Column( CreatePlusMinusPercentageHeader(rankColumn), BuildPlusMinusPercentageRows(metricsByContext.Select(x => x.OrderedMetrics), rankColumn).ToArray(), HorizontalAlignment.Right)); yield return(new Column( "Total", BuildElapsedColumn(metricsByContext.Select(x => x.OrderedMetrics), RankColumn.Total).ToArray(), HorizontalAlignment.Right)); yield return(new Column( "Average", BuildElapsedColumn(metricsByContext.Select(x => x.OrderedMetrics), RankColumn.Average).ToArray(), HorizontalAlignment.Right)); yield return(new Column( "Median", BuildElapsedColumn(metricsByContext.Select(x => x.OrderedMetrics), RankColumn.Median).ToArray(), HorizontalAlignment.Right)); yield return(new Column( "Runs", BuildNumberOfRunsRows(metricsByContext.Select(x => x.OrderedMetrics)).ToArray(), HorizontalAlignment.Right)); if (results.Any(result => result.CandidateMetrics.Any(x => x.HasComment()))) { yield return(new Column( "Comment", BuildCommentRows(metricsByContext.Select(x => x.OrderedMetrics)).ToArray(), HorizontalAlignment.Left)); } }
private IEnumerable <(IBenchmarkContext Context, CandidateMetrics[] OrderedMetrics)> CreateOrderedMetrics( IEnumerable <BenchmarkResult> results, RankColumn rankOrder) { var sortKey = new Func <CandidateMetrics, object>(metrics => GetElapsed(metrics, rankOrder)); return(results .Select(result => (result.Context, result.CandidateMetrics.OrderBy(sortKey).ToArray()))); }
private IEnumerable <string[]> BuildElapsedColumn( IEnumerable <CandidateMetrics[]> orderedMetricGroups, RankColumn mode) { return(orderedMetricGroups.Select( orderedMetrics => { var durations = orderedMetrics.Select(metrics => GetElapsed(metrics, mode)).ToArray(); var format = CreateTimeSpanFormatter(durations.Min()); return orderedMetrics .Select(metrics => format(GetElapsed(metrics, mode))) .ToArray(); })); }
protected string DoFormat( IEnumerable <BenchmarkResult> results, RankColumn rankColumn, bool allowNesting) { var columnFactory = new ColumnFactory(); var columns = columnFactory.Create(results, rankColumn, allowNesting).ToArray(); var output = new StringBuilder(); output.AppendLine( BuildLine(columns.Select(FormatHeader))); if (HasRowSeparators) { output.AppendLine( BuildLine(columns.Select(FormatHeaderRowSeparator))); } var primeColumn = columns.First(); var numberOfRowGroups = primeColumn.RowGroups.Count(); for (var rowGroupIndex = 0; rowGroupIndex < numberOfRowGroups; rowGroupIndex++) { var numberOfRows = primeColumn.RowGroups[rowGroupIndex].Count(); for (var rowIndex = 0; rowIndex < numberOfRows; rowIndex++) { output.AppendLine( BuildLine(columns.Select(column => FormatValue(column, rowGroupIndex, rowIndex)))); } if (HasRowSeparators) { output.AppendLine( BuildLine(columns.Select(FormatContextRowSeparator))); } } return(output.ToString()); }
public string Format( IEnumerable <BenchmarkResult> results, RankColumn order) { return(DoFormat(results, order, true)); }
public string ToMarkdown(RankColumn order = RankColumn.Median) { return(new MarkupReportFormatter().Format(Results, order)); }
public string ToString(RankColumn order = RankColumn.Median) { return(new DefaultReportFormatter().Format(Results, order)); }