blob: 3519e76a3c80d3aa359ddfde1814c8801ee5bfb4 [file] [log] [blame]
 // Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package benchmath import "fmt" // AssumeExact is an assumption that a value can be measured exactly // and thus has no distribution and does not require repeated sampling. // It reports a warning if not all values in a sample are equal. var AssumeExact = assumeExact{} type assumeExact struct{} var _ Assumption = assumeExact{} func (assumeExact) SummaryLabel() string { // Really the summary is the mode, but the point of this // assumption is that the summary is the exact value. return "exact" } func (assumeExact) Summary(s *Sample, confidence float64) Summary { // Find the sample's mode. This checks if all samples are the // same, and lets us return a reasonable summary even if they // aren't all the same. val, count := s.Values, 1 modeVal, modeCount := val, count for _, v := range s.Values[1:] { if v == val { count++ if count > modeCount { modeVal, modeCount = val, count } } else { val, count = v, 1 } } summary := Summary{Center: modeVal, Lo: s.Values, Hi: s.Values[len(s.Values)-1], Confidence: 1} if modeCount != len(s.Values) { // They're not all the same. Report a warning. summary.Warnings = []error{fmt.Errorf("exact distribution expected, but values range from %v to %v", s.Values, s.Values[len(s.Values)-1])} } return summary } func (assumeExact) Compare(s1, s2 *Sample) Comparison { return Comparison{P: 0, N1: len(s1.Values), N2: len(s2.Values)} }