From 39a0e9a3762d7d050f6b6887da0b20be96dd86e8 Mon Sep 17 00:00:00 2001 From: Max Altgelt Date: Tue, 26 Jan 2021 12:36:40 +0100 Subject: [PATCH] Write plain text in chunks Instead of writing each byte alone to the console, always write the full plain text up to the next escape sequence or until the write is finished. Doing so means more copying around of bytes, but improves write performance significantly. --- colorable_windows.go | 10 +++++++--- noncolorable.go | 13 +++++++------ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/colorable_windows.go b/colorable_windows.go index 41215d7..c111089 100644 --- a/colorable_windows.go +++ b/colorable_windows.go @@ -452,18 +452,22 @@ func (w *Writer) Write(data []byte) (n int, err error) { } else { er = bytes.NewReader(data) } - var bw [1]byte + var plaintext bytes.Buffer loop: for { c1, err := er.ReadByte() if err != nil { + plaintext.WriteTo(w.out) break loop } if c1 != 0x1b { - bw[0] = c1 - w.out.Write(bw[:]) + plaintext.WriteByte(c1) continue } + _, err = plaintext.WriteTo(w.out) + if err != nil { + break loop + } c2, err := er.ReadByte() if err != nil { break loop diff --git a/noncolorable.go b/noncolorable.go index 2dcb09a..3df68f3 100644 --- a/noncolorable.go +++ b/noncolorable.go @@ -18,21 +18,22 @@ func NewNonColorable(w io.Writer) io.Writer { // Write writes data on console func (w *NonColorable) Write(data []byte) (n int, err error) { er := bytes.NewReader(data) - var bw [1]byte + var plaintext bytes.Buffer loop: for { c1, err := er.ReadByte() if err != nil { + plaintext.WriteTo(w.out) break loop } if c1 != 0x1b { - bw[0] = c1 - _, err = w.out.Write(bw[:]) - if err != nil { - break loop - } + plaintext.WriteByte(c1) continue } + _, err = plaintext.WriteTo(w.out) + if err != nil { + break loop + } c2, err := er.ReadByte() if err != nil { break loop