From 2c46cc8b8997f4f5cdb7766e4e2bdf8e57f67c76 Mon Sep 17 00:00:00 2001 From: Amarjeet Anand Date: Sat, 13 Aug 2022 22:00:33 +0530 Subject: [PATCH] time: optimize GoString MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Optimize Time.GoString by avoiding multiple calls to absDate. name old time/op new time/op delta GoString-8 313ns ± 2% 197ns ± 1% -37.08% (p=0.008 n=5+5) name old alloc/op new alloc/op delta GoString-8 80.0B ± 0% 80.0B ± 0% ~ (all equal) name old allocs/op new allocs/op delta GoString-8 1.00 ± 0% 1.00 ± 0% ~ (all equal) Fixes #54436 Change-Id: I8e6f8e7bbb9857b4bc0cdf6ed29a6b2415775db7 Reviewed-on: https://go-review.googlesource.com/c/go/+/423634 Run-TryBot: Joseph Tsai Reviewed-by: Ian Lance Taylor Reviewed-by: Joseph Tsai TryBot-Result: Gopher Robot Auto-Submit: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov Run-TryBot: Ian Lance Taylor --- src/time/format.go | 21 ++++++++++++--------- src/time/time_test.go | 7 +++++++ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/time/format.go b/src/time/format.go index 721a207c0e..80495c0266 100644 --- a/src/time/format.go +++ b/src/time/format.go @@ -540,26 +540,29 @@ func (t Time) String() string { // GoString implements fmt.GoStringer and formats t to be printed in Go source // code. func (t Time) GoString() string { - buf := make([]byte, 0, 70) + abs := t.abs() + year, month, day, _ := absDate(abs, true) + hour, minute, second := absClock(abs) + + buf := make([]byte, 0, len("time.Date(9999, time.September, 31, 23, 59, 59, 999999999, time.Local)")) buf = append(buf, "time.Date("...) - buf = appendInt(buf, t.Year(), 0) - month := t.Month() + buf = appendInt(buf, year, 0) if January <= month && month <= December { buf = append(buf, ", time."...) - buf = append(buf, t.Month().String()...) + buf = append(buf, longMonthNames[month-1]...) } else { // It's difficult to construct a time.Time with a date outside the // standard range but we might as well try to handle the case. buf = appendInt(buf, int(month), 0) } buf = append(buf, ", "...) - buf = appendInt(buf, t.Day(), 0) + buf = appendInt(buf, day, 0) buf = append(buf, ", "...) - buf = appendInt(buf, t.Hour(), 0) + buf = appendInt(buf, hour, 0) buf = append(buf, ", "...) - buf = appendInt(buf, t.Minute(), 0) + buf = appendInt(buf, minute, 0) buf = append(buf, ", "...) - buf = appendInt(buf, t.Second(), 0) + buf = appendInt(buf, second, 0) buf = append(buf, ", "...) buf = appendInt(buf, t.Nanosecond(), 0) buf = append(buf, ", "...) @@ -586,7 +589,7 @@ func (t Time) GoString() string { // case we hope not to hit too often. buf = append(buf, `time.Location(`...) buf = append(buf, []byte(quote(loc.name))...) - buf = append(buf, `)`...) + buf = append(buf, ')') } buf = append(buf, ')') return string(buf) diff --git a/src/time/time_test.go b/src/time/time_test.go index 059c71bb8a..8ab79d3801 100644 --- a/src/time/time_test.go +++ b/src/time/time_test.go @@ -1487,6 +1487,13 @@ func BenchmarkISOWeek(b *testing.B) { } } +func BenchmarkGoString(b *testing.B) { + t := Now() + for i := 0; i < b.N; i++ { + _ = t.GoString() + } +} + func TestMarshalBinaryZeroTime(t *testing.T) { t0 := Time{} enc, err := t0.MarshalBinary() -- 2.48.1