| // 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 benchproc | |
| // NonSingularFields returns the subset of Fields for which at least two of keys | |
| // have different values. | |
| // | |
| // This is useful for warning the user if aggregating a set of results has | |
| // resulted in potentially hiding important configuration differences. Typically | |
| // these keys are "residue" keys produced by ProjectionParser.Residue. | |
| func NonSingularFields(keys []Key) []*Field { | |
| // TODO: This is generally used on residue keys, but those might | |
| // just have ".fullname" (generally with implicit exclusions). | |
| // Telling the user that a set of benchmarks varies in ".fullname" | |
| // isn't nearly as useful as listing out the specific subfields. We | |
| // should synthesize "/N" subfields for ".fullname" for this (this | |
| // makes even more sense if we make .fullname a group field that | |
| // already has these subfields). | |
| if len(keys) <= 1 { | |
| // There can't be any differences. | |
| return nil | |
| } | |
| var out []*Field | |
| fields := commonProjection(keys).FlattenedFields() | |
| for _, f := range fields { | |
| base := keys[0].Get(f) | |
| for _, k := range keys[1:] { | |
| if k.Get(f) != base { | |
| out = append(out, f) | |
| break | |
| } | |
| } | |
| } | |
| return out | |
| } |