aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Martí <mvdan@mvdan.cc>2022-04-21 14:00:26 +0100
committerDaniel Martí <mvdan@mvdan.cc>2022-04-21 21:07:15 +0000
commitf5af1e83a526146a12af48df9d5c9851e24569d7 (patch)
treebc6ac394c5f6f19d59abdb877ad75abed41e1899
parent4d96c3cdadb7de81ced18eceaa906f35730523f4 (diff)
downloadgo-f5af1e83a526146a12af48df9d5c9851e24569d7.tar.gz
go-f5af1e83a526146a12af48df9d5c9851e24569d7.zip
cmd/gofmt: only resolve go/ast objects when needed
go/parser will by default resolve objects as per the go/ast.Object type, which is then used by gofmt's rewrite and simplify flags. However, none of that is needed if neither of the flags is set, so we can avoid the work entirely for a nice speed-up. benchcmd -n 8 GofmtSrcCmd gofmt -l ~/tip/src/cmd name old time/op new time/op delta GofmtSrcCmd 957ms ± 7% 908ms ± 7% -5.12% (p=0.028 n=8+8) name old user-time/op new user-time/op delta GofmtSrcCmd 11.2s ± 1% 10.4s ± 1% -7.23% (p=0.001 n=7+7) name old sys-time/op new sys-time/op delta GofmtSrcCmd 325ms ±29% 286ms ±22% ~ (p=0.065 n=8+8) name old peak-RSS-bytes new peak-RSS-bytes delta GofmtSrcCmd 295MB ±17% 276MB ±15% ~ (p=0.328 n=8+8) See #46485. Change-Id: Iad1ae294953710c233f7837d7eb02e23d11c6185 Reviewed-on: https://go-review.googlesource.com/c/go/+/401454 Run-TryBot: Daniel Martí <mvdan@mvdan.cc> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Bryan Mills <bcmills@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com>
-rw-r--r--src/cmd/gofmt/gofmt.go5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/cmd/gofmt/gofmt.go b/src/cmd/gofmt/gofmt.go
index 5fa883fb56..9b639bd996 100644
--- a/src/cmd/gofmt/gofmt.go
+++ b/src/cmd/gofmt/gofmt.go
@@ -76,6 +76,11 @@ func initParserMode() {
if *allErrors {
parserMode |= parser.AllErrors
}
+ // Both -r and -s make use of go/ast's object resolution.
+ // If neither is being used, avoid that unnecessary work.
+ if *rewriteRule == "" && !*simplifyAST {
+ parserMode |= parser.SkipObjectResolution
+ }
}
func isGoFile(f fs.DirEntry) bool {