예제 #1
0
        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();
            }));
        }
예제 #2
0
        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));
            }
        }
예제 #3
0
        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())));
        }
예제 #4
0
        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());
        }
예제 #6
0
 public string Format(
     IEnumerable <BenchmarkResult> results,
     RankColumn order)
 {
     return(DoFormat(results, order, true));
 }
예제 #7
0
 public string ToMarkdown(RankColumn order = RankColumn.Median)
 {
     return(new MarkupReportFormatter().Format(Results, order));
 }
예제 #8
0
 public string ToString(RankColumn order = RankColumn.Median)
 {
     return(new DefaultReportFormatter().Format(Results, order));
 }