Yes, you are correct, if the template is only {{}}'s with no text then there is no benefit, but no penalty, either (i.e., no down side in performance). Once there is any reasonable amount of text (as all templates I have written are), the speed up is noticeable.
-Paul On Mon, Jul 11, 2016 at 12:46 PM, <sphilip...@gmail.com> wrote: > 1ms = 1000000ns. According to *Many results there is no gain. > > понедельник, 11 июля 2016 г., 22:27:47 UTC+3 пользователь Paul Borman > написал: > >> I was looking at text/template/parse/lex.go and noticed it seemed to be >> very inefficient in how it searched for {{ in its input. I rewrote lexText >> to us strings.Index rather than calling l.next() for every single rune in >> the string. The results were up to a 9x speed improvement, depending on >> the density of {{'s in the text. >> >> My results were: >> >> BenchmarkOldR512-4 100000 12300 ns/op >> BenchmarkNewR512-4 300000 4513 ns/op >> BenchmarkOldT512-4 100000 23600 ns/op >> BenchmarkNewT512-4 100000 13898 ns/op >> BenchmarkOldR8k-4 10000 133261 ns/op >> BenchmarkNewR8k-4 100000 14852 ns/op >> BenchmarkOldT8k-4 5000 264654 ns/op >> BenchmarkNewT8k-4 10000 135056 ns/op >> BenchmarkOldMany-4 300 5577909 ns/op >> BenchmarkNewMany-4 300 5632914 ns/op >> >> BenchmarkOldR512-4 100000 12100 ns/op >> BenchmarkNewR512-4 300000 4507 ns/op >> BenchmarkOldT512-4 100000 23297 ns/op >> BenchmarkNewT512-4 100000 14699 ns/op >> BenchmarkOldR8k-4 10000 136474 ns/op >> BenchmarkNewR8k-4 100000 16566 ns/op >> BenchmarkOldT8k-4 5000 266256 ns/op >> BenchmarkNewT8k-4 10000 137201 ns/op >> BenchmarkOldMany-4 300 5606573 ns/op >> BenchmarkNewMany-4 300 5596660 ns/op >> >> BenchmarkOldR512-4 100000 12150 ns/op >> BenchmarkNewR512-4 300000 4405 ns/op >> BenchmarkOldT512-4 100000 21539 ns/op >> BenchmarkNewT512-4 100000 13735 ns/op >> BenchmarkOldR8k-4 10000 133586 ns/op >> BenchmarkNewR8k-4 100000 14076 ns/op >> BenchmarkOldT8k-4 5000 264374 ns/op >> BenchmarkNewT8k-4 10000 132618 ns/op >> BenchmarkOldMany-4 300 5622040 ns/op >> BenchmarkNewMany-4 300 5638461 ns/op >> >> >> R512 was 512 bytes of Lorem Ipsum text with no {{}}'s >> R8K was 8,192 bytes of Lorem Ipsum text with no {{}}'s >> >> The T versions are the same, but with all occurrences of ipsum changed to >> {{.}} >> (3 times in T512 and 13 times in T8K). >> >> The Many version was the string "{{.}}" repeated 1000 times. >> >> The old code: >> >> for { >> delim, trimSpace := l.atLeftDelim() >> if delim { >> trimLength := Pos(0) >> if trimSpace { >> trimLength = >> rightTrimLength(l.input[l.start:l.pos]) >> } >> l.pos -= trimLength >> if l.pos > l.start { >> l.emit(itemText) >> } >> l.pos += trimLength >> l.ignore() >> return lexLeftDelim >> } >> if l.next() == eof { >> break >> } >> } >> >> >> The new code: >> >> l.width = 0 >> if x := strings.Index(l.input[l.pos:], l.leftDelim); x >= 0 { >> ldn := Pos(len(l.leftDelim)) >> l.pos += Pos(x) >> trimLength := Pos(0) >> if strings.HasPrefix(l.input[l.pos+ldn:], leftTrimMarker) >> { >> trimLength = >> rightTrimLength(l.input[l.start:l.pos]) >> } >> l.pos -= trimLength >> if l.pos > l.start { >> l.emit(itemText) >> } >> l.pos += trimLength >> l.ignore() >> return lexLeftDelim >> } else { >> l.pos = Pos(len(l.input)) >> } >> >> Is this something that would be accepted into the standard library? >> >> Thanks, >> >> -Paul >> > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.