From fa9a2b1e2ed405e806de20f3328af3368ab93580 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 31 Jan 2024 19:44:36 +0530 Subject: [PATCH] Switch file input to use new SIMD parser to search for \n and \r in parallel --- kittens/pager/file_input.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/kittens/pager/file_input.go b/kittens/pager/file_input.go index 23e8cd15b..9759c5b42 100644 --- a/kittens/pager/file_input.go +++ b/kittens/pager/file_input.go @@ -13,6 +13,8 @@ import ( "unsafe" "golang.org/x/sys/unix" + + "kitty/tools/simdstring" ) var _ = fmt.Print @@ -68,13 +70,16 @@ func read_input(input_file *os.File, input_file_name string, input_channel chan< if count_carriage_returns { process_chunk = func(chunk []byte) { - for _, ch := range chunk { - switch ch { + for len(chunk) > 0 { + idx := simdstring.UnsafeIndexByte2(chunk, '\n', '\r') + if idx == -1 { + _, _ = output_buf.Write(chunk) + chunk = nil + } + switch chunk[idx] { case '\r': num_carriage_returns += 1 default: - _ = output_buf.WriteByte(ch) - case '\n': input_channel <- input_line_struct{line: output_buf.String(), num_carriage_returns: num_carriage_returns, is_a_complete_line: true} num_carriage_returns = 0 output_buf.Reset()