Skip to content

Commit

Permalink
Write plain text in chunks
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
secDre4mer committed Sep 21, 2021
1 parent a2827f0 commit 39a0e9a
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 9 deletions.
10 changes: 7 additions & 3 deletions colorable_windows.go
Expand Up @@ -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
Expand Down
13 changes: 7 additions & 6 deletions noncolorable.go
Expand Up @@ -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
Expand Down

0 comments on commit 39a0e9a

Please sign in to comment.