summaryrefslogtreecommitdiff
path: root/src/reader.go
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2015-08-02 14:00:18 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2015-08-02 14:00:18 +0900
commit0ea66329b84cc6e4f8ff61ee99c00bb238070247 (patch)
tree72c3bc62ec491246390b56b2aac5b33645839503 /src/reader.go
parent634670e3ea51a2fa1498a3de0c074b819828e2d8 (diff)
downloadfzf-0ea66329b84cc6e4f8ff61ee99c00bb238070247.tar.gz
Performance tuning - eager rune array conversion
> wc -l /tmp/list2 2594098 /tmp/list2 > time cat /tmp/list2 | fzf-0.10.1-darwin_amd64 -fqwerty > /dev/null real 0m5.418s user 0m10.990s sys 0m1.302s > time cat /tmp/list2 | fzf-head -fqwerty > /dev/null real 0m4.862s user 0m6.619s sys 0m0.982s
Diffstat (limited to 'src/reader.go')
-rw-r--r--src/reader.go25
1 files changed, 19 insertions, 6 deletions
diff --git a/src/reader.go b/src/reader.go
index aab8b02a..d979eb6a 100644
--- a/src/reader.go
+++ b/src/reader.go
@@ -5,13 +5,14 @@ import (
"io"
"os"
"os/exec"
+ "unicode/utf8"
"github.com/junegunn/fzf/src/util"
)
// Reader reads from command or standard input
type Reader struct {
- pusher func(string) bool
+ pusher func([]rune) bool
eventBox *util.EventBox
delimNil bool
}
@@ -37,13 +38,25 @@ func (r *Reader) feed(src io.Reader) {
}
reader := bufio.NewReader(src)
for {
- line, err := reader.ReadString(delim)
- if line != "" {
- // "ReadString returns err != nil if and only if the returned data does not end in delim."
+ // ReadBytes returns err != nil if and only if the returned data does not
+ // end in delim.
+ bytea, err := reader.ReadBytes(delim)
+ if len(bytea) > 0 {
+ runes := make([]rune, 0, len(bytea))
+ for i := 0; i < len(bytea); {
+ if bytea[i] < utf8.RuneSelf {
+ runes = append(runes, rune(bytea[i]))
+ i++
+ } else {
+ r, sz := utf8.DecodeRune(bytea[i:])
+ i += sz
+ runes = append(runes, r)
+ }
+ }
if err == nil {
- line = line[:len(line)-1]
+ runes = runes[:len(runes)-1]
}
- if r.pusher(line) {
+ if r.pusher(runes) {
r.eventBox.Set(EvtReadNew, nil)
}
}