diff --git a/decor/optimistic_string_writer.go b/decor/optimistic_string_writer.go deleted file mode 100644 index c6a3438..0000000 --- a/decor/optimistic_string_writer.go +++ /dev/null @@ -1,10 +0,0 @@ -package decor - -import "io" - -func mustWriteString(w io.Writer, s string) { - _, err := io.WriteString(w, s) - if err != nil { - panic(err) - } -} diff --git a/decor/percentage.go b/decor/percentage.go index d39522f..5365842 100644 --- a/decor/percentage.go +++ b/decor/percentage.go @@ -23,11 +23,18 @@ } } - mustWriteString(st, strconv.FormatFloat(float64(s), 'f', prec, 64)) + p := bytePool.Get().(*[]byte) + b := strconv.AppendFloat(*p, float64(s), 'f', prec, 64) if st.Flag(' ') { - mustWriteString(st, " ") + b = append(b, ' ', '%') + } else { + b = append(b, '%') } - mustWriteString(st, "%") + _, err := st.Write(b) + bytePool.Put(p) + if err != nil { + panic(err) + } } // Percentage returns percentage decorator. It's a wrapper of NewPercentage. diff --git a/decor/pool.go b/decor/pool.go new file mode 100644 index 0000000..c8b3cc6 --- /dev/null +++ b/decor/pool.go @@ -0,0 +1,10 @@ +package decor + +import "sync" + +var bytePool = sync.Pool{ + New: func() interface{} { + b := make([]byte, 0, 16) + return &b + }, +} diff --git a/decor/size_type.go b/decor/size_type.go index 09ecc23..c6205e8 100644 --- a/decor/size_type.go +++ b/decor/size_type.go @@ -49,11 +49,17 @@ unit = _iTiB } - mustWriteString(st, strconv.FormatFloat(float64(self)/float64(unit), 'f', prec, 64)) + p := bytePool.Get().(*[]byte) + b := strconv.AppendFloat(*p, float64(self)/float64(unit), 'f', prec, 64) if st.Flag(' ') { - mustWriteString(st, " ") + b = append(b, ' ') } - mustWriteString(st, unit.String()) + b = append(b, []byte(unit.String())...) + _, err := st.Write(b) + bytePool.Put(p) + if err != nil { + panic(err) + } } const ( @@ -97,9 +103,15 @@ unit = _TB } - mustWriteString(st, strconv.FormatFloat(float64(self)/float64(unit), 'f', prec, 64)) + p := bytePool.Get().(*[]byte) + b := strconv.AppendFloat(*p, float64(self)/float64(unit), 'f', prec, 64) if st.Flag(' ') { - mustWriteString(st, " ") + b = append(b, ' ') } - mustWriteString(st, unit.String()) + b = append(b, []byte(unit.String())...) + _, err := st.Write(b) + bytePool.Put(p) + if err != nil { + panic(err) + } } diff --git a/decor/speed.go b/decor/speed.go index f2ba691..e37302e 100644 --- a/decor/speed.go +++ b/decor/speed.go @@ -22,7 +22,10 @@ func (self *speedFormatter) Format(st fmt.State, verb rune) { self.Formatter.Format(st, verb) - mustWriteString(st, "/s") + _, err := st.Write([]byte("/s")) + if err != nil { + panic(err) + } } // EwmaSpeed exponential-weighted-moving-average based speed decorator.