message: optimize lookupAndFormat function for better performance
This commit optimizes the lookupAndFormat function to reduce code redundancy
and improve performance. Benchmarks show a significant performance increase
across various Sprintf and Fprint functions.
benchstat old.txt new.txt
goos: darwin
goarch: arm64
pkg: golang.org/x/text/message
│ old.txt │ new.txt │
│ sec/op │ sec/op vs base │
SprintfPadding-12 333.0n ± 1% 216.0n ± 1% -35.15% (p=0.000 n=10)
SprintfEmpty-12 307.3n ± 1% 170.9n ± 1% -44.38% (p=0.000 n=10)
SprintfString-12 313.5n ± 1% 178.9n ± 2% -42.91% (p=0.000 n=10)
SprintfTruncateString-12 315.6n ± 1% 182.3n ± 2% -42.23% (p=0.000 n=10)
SprintfQuoteString-12 320.1n ± 0% 198.6n ± 1% -37.96% (p=0.000 n=10)
SprintfInt-12 325.0n ± 1% 203.1n ± 1% -37.51% (p=0.000 n=10)
SprintfIntInt-12 340.2n ± 1% 233.2n ± 2% -31.47% (p=0.000 n=10)
SprintfPrefixedInt-12 335.2n ± 1% 226.2n ± 1% -32.54% (p=0.000 n=10)
SprintfFloat-12 330.1n ± 1% 209.7n ± 1% -36.48% (p=0.000 n=10)
SprintfComplex-12 365.1n ± 1% 276.0n ± 2% -24.41% (p=0.000 n=10)
SprintfBoolean-12 311.8n ± 0% 178.6n ± 3% -42.72% (p=0.000 n=10)
SprintfHexString-12 328.1n ± 1% 204.8n ± 2% -37.56% (p=0.000 n=10)
SprintfHexBytes-12 334.0n ± 2% 216.4n ± 1% -35.20% (p=0.000 n=10)
SprintfBytes-12 340.8n ± 7% 213.9n ± 1% -37.25% (p=0.000 n=10)
SprintfStringer-12 662.5n ± 3% 453.2n ± 1% -31.59% (p=0.000 n=10)
SprintfStructure-12 373.8n ± 6% 275.7n ± 1% -26.23% (p=0.000 n=10)
ManyArgs-12 485.1n ± 4% 425.4n ± 1% -12.30% (p=0.000 n=10)
FprintInt-12 265.8n ± 2% 262.0n ± 1% -1.41% (p=0.011 n=10)
FprintfBytes-12 348.4n ± 1% 258.8n ± 1% -25.70% (p=0.000 n=10)
FprintIntNoAlloc-12 262.0n ± 2% 261.2n ± 2% ~ (p=0.565 n=10)
geomean 342.4n 233.7n -31.75%
Change-Id: Id9999469f3fd0ca0290a5cb81f42fff81277b451
GitHub-Last-Rev: 904d624b132ac1a49cdd908e9b95ff2b16a5f7a0
GitHub-Pull-Request: golang/text#51
Reviewed-on: https://go-review.googlesource.com/c/text/+/584095
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
Auto-Submit: Ian Lance Taylor <iant@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
diff --git a/message/message.go b/message/message.go
index 48d7663..91a9726 100644
--- a/message/message.go
+++ b/message/message.go
@@ -138,21 +138,20 @@
func lookupAndFormat(p *printer, r Reference, a []interface{}) {
p.fmt.Reset(a)
- var id, msg string
switch v := r.(type) {
case string:
- id, msg = v, v
- case key:
- id, msg = v.id, v.fallback
- default:
- panic("key argument is not a Reference")
- }
-
- if p.catContext.Execute(id) == catalog.ErrNotFound {
- if p.catContext.Execute(msg) == catalog.ErrNotFound {
- p.Render(msg)
+ if p.catContext.Execute(v) == catalog.ErrNotFound {
+ p.Render(v)
return
}
+ case key:
+ if p.catContext.Execute(v.id) == catalog.ErrNotFound &&
+ p.catContext.Execute(v.fallback) == catalog.ErrNotFound {
+ p.Render(v.fallback)
+ return
+ }
+ default:
+ panic("key argument is not a Reference")
}
}