Skip to content

Commit 39a0e9a

Browse files
committed
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.
1 parent a2827f0 commit 39a0e9a

File tree

2 files changed

+14
-9
lines changed

2 files changed

+14
-9
lines changed

colorable_windows.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -452,18 +452,22 @@ func (w *Writer) Write(data []byte) (n int, err error) {
452452
} else {
453453
er = bytes.NewReader(data)
454454
}
455-
var bw [1]byte
455+
var plaintext bytes.Buffer
456456
loop:
457457
for {
458458
c1, err := er.ReadByte()
459459
if err != nil {
460+
plaintext.WriteTo(w.out)
460461
break loop
461462
}
462463
if c1 != 0x1b {
463-
bw[0] = c1
464-
w.out.Write(bw[:])
464+
plaintext.WriteByte(c1)
465465
continue
466466
}
467+
_, err = plaintext.WriteTo(w.out)
468+
if err != nil {
469+
break loop
470+
}
467471
c2, err := er.ReadByte()
468472
if err != nil {
469473
break loop

noncolorable.go

+7-6
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,22 @@ func NewNonColorable(w io.Writer) io.Writer {
1818
// Write writes data on console
1919
func (w *NonColorable) Write(data []byte) (n int, err error) {
2020
er := bytes.NewReader(data)
21-
var bw [1]byte
21+
var plaintext bytes.Buffer
2222
loop:
2323
for {
2424
c1, err := er.ReadByte()
2525
if err != nil {
26+
plaintext.WriteTo(w.out)
2627
break loop
2728
}
2829
if c1 != 0x1b {
29-
bw[0] = c1
30-
_, err = w.out.Write(bw[:])
31-
if err != nil {
32-
break loop
33-
}
30+
plaintext.WriteByte(c1)
3431
continue
3532
}
33+
_, err = plaintext.WriteTo(w.out)
34+
if err != nil {
35+
break loop
36+
}
3637
c2, err := er.ReadByte()
3738
if err != nil {
3839
break loop

0 commit comments

Comments
 (0)