From ab7ccd9a2a8899ff47fdcf73463f34007c5ead78 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 | 7 ++++--- noncolorable.go | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/colorable_windows.go b/colorable_windows.go index 04c4229..b47ee3a 100644 --- a/colorable_windows.go +++ b/colorable_windows.go @@ -452,18 +452,19 @@ 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 } + plaintext.WriteTo(w.out) c2, err := er.ReadByte() if err != nil { break loop diff --git a/noncolorable.go b/noncolorable.go index 95f2c6b..fc41f8e 100644 --- a/noncolorable.go +++ b/noncolorable.go @@ -18,18 +18,19 @@ 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 - w.out.Write(bw[:]) + plaintext.WriteByte(c1) continue } + plaintext.WriteTo(w.out) c2, err := er.ReadByte() if err != nil { break loop