public string GetValue(Summary summary, BenchmarkCase benchmarkCase) { string logicalGroupKey = summary.GetLogicalGroupKey(benchmarkCase); var baseline = summary.BenchmarksCases .Where(b => summary.GetLogicalGroupKey(b) == logicalGroupKey) .FirstOrDefault(b => b.IsBaseline()); bool invalidResults = baseline == null || summary[baseline] == null || summary[baseline].ResultStatistics == null || !summary[baseline].ResultStatistics.CanBeInverted() || summary[benchmarkCase] == null || summary[benchmarkCase].ResultStatistics == null; if (invalidResults) { return("?"); } var baselineStat = summary[baseline].ResultStatistics; var targetStat = summary[benchmarkCase].ResultStatistics; double mean = benchmarkCase.IsBaseline() ? 1 : Statistics.DivMean(targetStat, baselineStat); double stdDev = benchmarkCase.IsBaseline() ? 0 : Math.Sqrt(Statistics.DivVariance(targetStat, baselineStat)); switch (Kind) { case DiffKind.Mean: return(IsNonBaselinesPrecise(summary, baselineStat, benchmarkCase) ? mean.ToStr("N3") : mean.ToStr("N2")); case DiffKind.StdDev: return(stdDev.ToStr("N2")); case DiffKind.WelchTTestPValue: { if (baselineStat.N < 2 || targetStat.N < 2) { return("NA"); } double pvalue = WelchTTest.Calc(baselineStat, targetStat).PValue; return(pvalue > 0.0001 || pvalue < 1e-9 ? pvalue.ToStr("N4") : pvalue.ToStr("e2")); } default: throw new NotSupportedException(); } }
public string GetValue(Summary summary, BenchmarkCase benchmarkCase) => benchmarkCase.IsBaseline() ? "Yes" : "No";