1// Copyright 2011 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 5// This benchmark tests text/template throughput, 6// converting a large data structure with a simple template. 7 8package go1 9 10import ( 11 "bytes" 12 "io/ioutil" 13 "strings" 14 "testing" 15 "text/template" 16) 17 18// After removing \t and \n this generates identical output to 19// json.Marshal, making it easy to test for correctness. 20const tmplText = ` 21{ 22 "tree":{{template "node" .Tree}}, 23 "username":"{{.Username}}" 24} 25{{define "node"}} 26{ 27 "name":"{{.Name}}", 28 "kids":[ 29 {{range $i, $k := .Kids}} 30 {{if $i}} 31 , 32 {{end}} 33 {{template "node" $k}} 34 {{end}} 35 ], 36 "cl_weight":{{.CLWeight}}, 37 "touches":{{.Touches}}, 38 "min_t":{{.MinT}}, 39 "max_t":{{.MaxT}}, 40 "mean_t":{{.MeanT}} 41} 42{{end}} 43` 44 45func stripTabNL(r rune) rune { 46 if r == '\t' || r == '\n' { 47 return -1 48 } 49 return r 50} 51 52var tmpl = template.Must(template.New("main").Parse(strings.Map(stripTabNL, tmplText))) 53 54func init() { 55 var buf bytes.Buffer 56 if err := tmpl.Execute(&buf, &jsondata); err != nil { 57 panic(err) 58 } 59 if !bytes.Equal(buf.Bytes(), jsonbytes) { 60 println(buf.Len(), len(jsonbytes)) 61 panic("wrong output") 62 } 63} 64 65func tmplexec() { 66 if err := tmpl.Execute(ioutil.Discard, &jsondata); err != nil { 67 panic(err) 68 } 69} 70 71func BenchmarkTemplate(b *testing.B) { 72 b.SetBytes(int64(len(jsonbytes))) 73 for i := 0; i < b.N; i++ { 74 tmplexec() 75 } 76} 77