summaryrefslogtreecommitdiffstats
path: root/test/bench/go1/template_test.go
blob: b7e98d5c2099e39c0429b2d1e232bcb5d13d3917 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// Copyright 2011 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.

// This benchmark tests text/template throughput,
// converting a large data structure with a simple template.

package go1

import (
	"bytes"
	"io"
	"strings"
	"testing"
	"text/template"
)

// After removing \t and \n this generates identical output to
// json.Marshal, making it easy to test for correctness.
const tmplText = `
{
	"tree":{{template "node" .Tree}},
	"username":"{{.Username}}"
}
{{define "node"}}
{
	"name":"{{.Name}}",
	"kids":[
	{{range $i, $k := .Kids}}
		{{if $i}}
			,
		{{end}}
		{{template "node" $k}}
	{{end}}
	],
	"cl_weight":{{.CLWeight}},
	"touches":{{.Touches}},
	"min_t":{{.MinT}},
	"max_t":{{.MaxT}},
	"mean_t":{{.MeanT}}
}
{{end}}
`

func stripTabNL(r rune) rune {
	if r == '\t' || r == '\n' {
		return -1
	}
	return r
}

var tmpl = template.Must(template.New("main").Parse(strings.Map(stripTabNL, tmplText)))

func init() {
	var buf bytes.Buffer
	if err := tmpl.Execute(&buf, &jsondata); err != nil {
		panic(err)
	}
	if !bytes.Equal(buf.Bytes(), jsonbytes) {
		println(buf.Len(), len(jsonbytes))
		panic("wrong output")
	}
}

func tmplexec() {
	if err := tmpl.Execute(io.Discard, &jsondata); err != nil {
		panic(err)
	}
}

func BenchmarkTemplate(b *testing.B) {
	b.SetBytes(int64(len(jsonbytes)))
	for i := 0; i < b.N; i++ {
		tmplexec()
	}
}