1// $G -N -o slow.$A $D/bug369.dir/pkg.go &&
2// $G -o fast.$A $D/bug369.dir/pkg.go &&
3// run
4
5// NOTE: This test is not run by 'run.go' and so not run by all.bash.
6// To run this test you must use the ./run shell script.
7
8// Copyright 2011 The Go Authors.  All rights reserved.
9// Use of this source code is governed by a BSD-style
10// license that can be found in the LICENSE file.
11
12// Test that compiling with optimization turned on produces faster code.
13
14package main
15
16import (
17	"flag"
18	"os"
19	"runtime"
20	"testing"
21
22	fast "./fast"
23	slow "./slow"
24)
25
26var buf = make([]byte, 1048576)
27
28func BenchmarkFastNonASCII(b *testing.B) {
29	for i := 0; i < b.N; i++ {
30		fast.NonASCII(buf, 0)
31	}
32}
33
34func BenchmarkSlowNonASCII(b *testing.B) {
35	for i := 0; i < b.N; i++ {
36		slow.NonASCII(buf, 0)
37	}
38}
39
40func main() {
41	os.Args = []string{os.Args[0], "-test.benchtime=100ms"}
42	flag.Parse()
43
44	rslow := testing.Benchmark(BenchmarkSlowNonASCII)
45	rfast := testing.Benchmark(BenchmarkFastNonASCII)
46	tslow := rslow.NsPerOp()
47	tfast := rfast.NsPerOp()
48
49	// Optimization should be good for at least 2x, but be forgiving.
50	// On the ARM simulator we see closer to 1.5x.
51	speedup := float64(tslow)/float64(tfast)
52	want := 1.8
53	if runtime.GOARCH == "arm" {
54		want = 1.3
55	}
56	if speedup < want {
57		// TODO(rsc): doesn't work on linux-amd64 or darwin-amd64 builders, nor on
58		// a Lenovo x200 (linux-amd64) laptop.
59		//println("fast:", tfast, "slow:", tslow, "speedup:", speedup, "want:", want)
60		//println("not fast enough")
61	}
62}
63