diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2016-08-17 06:37:19 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2016-09-14 10:50:56 +0200 |
commit | 4abaec5c045e92ae5f8b3a2dc66606b080ef6ea5 (patch) | |
tree | cf8c09108526475a9b445a9ba34656a9b17b9494 /helpers/content.go | |
parent | bcd434794a28ff75a6e6504c6c3bada554ba88ce (diff) |
Improve TotalWords counter func
It is obviously more efficient when we do not care about the actual words.
```
BenchmarkTotalWords-4 100000 18795 ns/op 0 B/op 0 allocs/op
BenchmarkTotalWordsOld-4 30000 46751 ns/op 6400 B/op 1 allocs/op
```
Diffstat (limited to 'helpers/content.go')
-rw-r--r-- | helpers/content.go | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/helpers/content.go b/helpers/content.go index bb7819175..9d35675f7 100644 --- a/helpers/content.go +++ b/helpers/content.go @@ -384,8 +384,25 @@ func RenderBytes(ctx *RenderingContext) []byte { } } -// TotalWords returns an int of the total number of words in a given content. +// TotalWords counts instance of one or more consecutive white space +// characters, as defined by unicode.IsSpace, in s. +// This is a cheaper way of word counting than the obvious len(strings.Fields(s)). func TotalWords(s string) int { + n := 0 + inWord := false + for _, r := range s { + wasInWord := inWord + inWord = !unicode.IsSpace(r) + if inWord && !wasInWord { + n++ + } + } + return n +} + +// Old implementation only kept for benchmark comparison. +// TODO(bep) remove +func totalWordsOld(s string) int { return len(strings.Fields(s)) } |