]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gofmt: only resolve go/ast objects when needed
authorDaniel Martí <mvdan@mvdan.cc>
Thu, 21 Apr 2022 13:00:26 +0000 (14:00 +0100)
committerDaniel Martí <mvdan@mvdan.cc>
Thu, 21 Apr 2022 21:07:15 +0000 (21:07 +0000)
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>
src/cmd/gofmt/gofmt.go

index 5fa883fb56232e65cb3718df0230d3e527b09ed4..9b639bd996323c3818939622590a5376a11a474b 100644 (file)
@@ -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 {