for i in 1 2 3; do \
go test -bench=. ./internal/...; \
done > benchmark_results
- benchstat benchmark_results_baseline benchmark_results
+ benchstat -alpha 0.15 benchmark_results_baseline benchmark_results
clean:
rm -f micro
// For rendering, micro will display the combining characters. It's not perfect
// but it's pretty good.
+var minMark = rune(unicode.Mark.R16[0].Lo)
+
+func isMark(r rune) bool {
+ // Fast path
+ if r < minMark {
+ return false
+ }
+ return unicode.In(r, unicode.Mark)
+}
+
// DecodeCharacter returns the next character from an array of bytes
// A character is a rune along with any accompanying combining runes
func DecodeCharacter(b []byte) (rune, []rune, int) {
c, s := utf8.DecodeRune(b)
var combc []rune
- for unicode.In(c, unicode.Mark) {
+ for isMark(c) {
combc = append(combc, c)
size += s
c, s := utf8.DecodeRuneInString(str)
var combc []rune
- for unicode.In(c, unicode.Mark) {
+ for isMark(c) {
combc = append(combc, c)
size += s
for len(b) > 0 {
r, size := utf8.DecodeRune(b)
- if !unicode.In(r, unicode.Mark) {
+ if !isMark(r) {
s++
}
s := 0
for _, r := range str {
- if !unicode.In(r, unicode.Mark) {
+ if !isMark(r) {
s++
}
}
"unicode/utf8"
)
+var minMark = rune(unicode.Mark.R16[0].Lo)
+
+func isMark(r rune) bool {
+ // Fast path
+ if r < minMark {
+ return false
+ }
+ return unicode.In(r, unicode.Mark)
+}
+
// DecodeCharacter returns the next character from an array of bytes
// A character is a rune along with any accompanying combining runes
func DecodeCharacter(b []byte) (rune, []rune, int) {
c, s := utf8.DecodeRune(b)
var combc []rune
- for unicode.In(c, unicode.Mark) {
+ for isMark(c) {
combc = append(combc, c)
size += s
c, s := utf8.DecodeRuneInString(str)
var combc []rune
- for unicode.In(c, unicode.Mark) {
+ for isMark(c) {
combc = append(combc, c)
size += s
for len(b) > 0 {
r, size := utf8.DecodeRune(b)
- if !unicode.In(r, unicode.Mark) {
+ if !isMark(r) {
s++
}
s := 0
for _, r := range str {
- if !unicode.In(r, unicode.Mark) {
+ if !isMark(r) {
s++
}
}