GoPLS Viewer

Home|gopls/cmd/benchcmp/compare_test.go
1// Copyright 2014 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package main
6
7import (
8    "math"
9    "reflect"
10    "sort"
11    "testing"
12
13    "golang.org/x/tools/benchmark/parse"
14)
15
16func TestDelta(t *testing.T) {
17    cases := []struct {
18        before  float64
19        after   float64
20        mag     float64
21        f       float64
22        changed bool
23        pct     string
24        mult    string
25    }{
26        {before1after1mag1f1changedfalsepct"+0.00%"mult"1.00x"},
27        {before1after2mag0.5f2changedtruepct"+100.00%"mult"2.00x"},
28        {before2after1mag0.5f0.5changedtruepct"-50.00%"mult"0.50x"},
29        {before0after0mag1f1changedfalsepct"+0.00%"mult"1.00x"},
30        {before1after0magmath.Inf(1), f0changedtruepct"-100.00%"mult"0.00x"},
31        {before0after1magmath.Inf(1), fmath.Inf(1), changedtruepct"+Inf%"mult"+Infx"},
32    }
33    for _tt := range cases {
34        d := Delta{tt.beforett.after}
35        if wanthave := tt.magd.mag(); want != have {
36            t.Errorf("%s.mag(): want %f have %f"dwanthave)
37        }
38        if wanthave := tt.fd.Float64(); want != have {
39            t.Errorf("%s.Float64(): want %f have %f"dwanthave)
40        }
41        if wanthave := tt.changedd.Changed(); want != have {
42            t.Errorf("%s.Changed(): want %t have %t"dwanthave)
43        }
44        if wanthave := tt.pctd.Percent(); want != have {
45            t.Errorf("%s.Percent(): want %q have %q"dwanthave)
46        }
47        if wanthave := tt.multd.Multiple(); want != have {
48            t.Errorf("%s.Multiple(): want %q have %q"dwanthave)
49        }
50    }
51}
52
53func TestCorrelate(t *testing.T) {
54    // Benches that are going to be successfully correlated get N thus:
55    //   0x<counter><num benches><b = before | a = after>
56    // Read this: "<counter> of <num benches>, from <before|after>".
57    before := parse.Set{
58        "BenchmarkOneEach":   []*parse.Benchmark{{Name"BenchmarkOneEach"N0x11b}},
59        "BenchmarkOneToNone": []*parse.Benchmark{{Name"BenchmarkOneToNone"}},
60        "BenchmarkOneToTwo":  []*parse.Benchmark{{Name"BenchmarkOneToTwo"}},
61        "BenchmarkTwoToOne": []*parse.Benchmark{
62            {Name"BenchmarkTwoToOne"},
63            {Name"BenchmarkTwoToOne"},
64        },
65        "BenchmarkTwoEach": []*parse.Benchmark{
66            {Name"BenchmarkTwoEach"N0x12b},
67            {Name"BenchmarkTwoEach"N0x22b},
68        },
69    }
70
71    after := parse.Set{
72        "BenchmarkOneEach":   []*parse.Benchmark{{Name"BenchmarkOneEach"N0x11a}},
73        "BenchmarkNoneToOne": []*parse.Benchmark{{Name"BenchmarkNoneToOne"}},
74        "BenchmarkTwoToOne":  []*parse.Benchmark{{Name"BenchmarkTwoToOne"}},
75        "BenchmarkOneToTwo": []*parse.Benchmark{
76            {Name"BenchmarkOneToTwo"},
77            {Name"BenchmarkOneToTwo"},
78        },
79        "BenchmarkTwoEach": []*parse.Benchmark{
80            {Name"BenchmarkTwoEach"N0x12a},
81            {Name"BenchmarkTwoEach"N0x22a},
82        },
83    }
84
85    pairserrs := Correlate(beforeafter)
86
87    // Fail to match: BenchmarkOneToNone, BenchmarkOneToTwo, BenchmarkTwoToOne.
88    // Correlate does not notice BenchmarkNoneToOne.
89    if len(errs) != 3 {
90        t.Errorf("Correlated expected 4 errors, got %d: %v"len(errs), errs)
91    }
92
93    // Want three correlated pairs: one BenchmarkOneEach, two BenchmarkTwoEach.
94    if len(pairs) != 3 {
95        t.Fatalf("Correlated expected 3 pairs, got %v"pairs)
96    }
97
98    for _pair := range pairs {
99        if pair.Before.N&0xF != 0xb {
100            t.Errorf("unexpected Before in pair %s"pair)
101        }
102        if pair.After.N&0xF != 0xa {
103            t.Errorf("unexpected After in pair %s"pair)
104        }
105        if pair.Before.N>>4 != pair.After.N>>4 {
106            t.Errorf("mismatched pair %s"pair)
107        }
108    }
109}
110
111func TestBenchCmpSorting(t *testing.T) {
112    c := []BenchCmp{
113        {&parse.Benchmark{Name"BenchmarkMuchFaster"NsPerOp10Ord3}, &parse.Benchmark{Name"BenchmarkMuchFaster"NsPerOp1}},
114        {&parse.Benchmark{Name"BenchmarkSameB"NsPerOp5Ord1}, &parse.Benchmark{Name"BenchmarkSameB"NsPerOp5}},
115        {&parse.Benchmark{Name"BenchmarkSameA"NsPerOp5Ord2}, &parse.Benchmark{Name"BenchmarkSameA"NsPerOp5}},
116        {&parse.Benchmark{Name"BenchmarkSlower"NsPerOp10Ord0}, &parse.Benchmark{Name"BenchmarkSlower"NsPerOp11}},
117    }
118
119    // Test just one magnitude-based sort order; they are symmetric.
120    sort.Sort(ByDeltaNsPerOp(c))
121    want := []string{"BenchmarkMuchFaster""BenchmarkSlower""BenchmarkSameA""BenchmarkSameB"}
122    have := []string{c[0].Name(), c[1].Name(), c[2].Name(), c[3].Name()}
123    if !reflect.DeepEqual(wanthave) {
124        t.Errorf("ByDeltaNsOp incorrect sorting: want %v have %v"wanthave)
125    }
126
127    sort.Sort(ByParseOrder(c))
128    want = []string{"BenchmarkSlower""BenchmarkSameB""BenchmarkSameA""BenchmarkMuchFaster"}
129    have = []string{c[0].Name(), c[1].Name(), c[2].Name(), c[3].Name()}
130    if !reflect.DeepEqual(wanthave) {
131        t.Errorf("ByParseOrder incorrect sorting: want %v have %v"wanthave)
132    }
133}
134
MembersX
TestBenchCmpSorting.have
TestDelta.t
TestDelta.RangeStmt_991.BlockStmt.d
TestCorrelate.t
TestBenchCmpSorting.t
TestBenchCmpSorting.c
TestDelta.cases
TestCorrelate.after
TestBenchCmpSorting
TestCorrelate
TestCorrelate.before
TestCorrelate.pairs
TestCorrelate.RangeStmt_3293.pair
TestDelta
TestDelta.RangeStmt_991.tt
TestDelta.RangeStmt_991.BlockStmt.have
TestDelta.RangeStmt_991.BlockStmt.want
TestCorrelate.errs
TestBenchCmpSorting.want
Members
X