golang / go

The Go programming language
https://go.dev
BSD 3-Clause "New" or "Revised" License
123.72k stars 17.62k forks source link

x/tools/cmd/goimports: too slow #16367

Closed romeovs closed 8 years ago

romeovs commented 8 years ago

Please answer these questions before submitting your issue. Thanks!

  1. What version of Go are you using (go version)?

    go version go1.6.2 darwin/amd64
  2. What operating system and processor architecture are you using (go env)?

    GOARCH="amd64"
    GOBIN=""
    GOEXE=""
    GOHOSTARCH="amd64"
    GOHOSTOS="darwin"
    GOOS="darwin"
    GOPATH="/Users/romeo/code/go"
    GORACE=""
    GOROOT="/usr/local/Cellar/go/1.6.2/libexec"
    GOTOOLDIR="/usr/local/Cellar/go/1.6.2/libexec/pkg/tool/darwin_amd64"
    GO15VENDOREXPERIMENT="1"
    CC="clang"
    GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fno-common"
    CXX="clang++"
    CGO_ENABLED="1"
  3. What did you do? I've got a repo with a lot of vendored libraries:

    $ tree vendor -d -L 2                                                                                     
    vendor
    ├── github.com
    │   ├── BurntSushi
    │   ├── TheThingsNetwork
    │   ├── apex
    │   ├── boltdb
    │   ├── brocaar
    │   ├── dgrijalva
    │   ├── eclipse
    │   ├── fsnotify
    │   ├── golang
    │   ├── googollee
    │   ├── gorilla
    │   ├── hashicorp
    │   ├── jacobsa
    │   ├── labstack
    │   ├── magiconair
    │   ├── mattn
    │   ├── mitchellh
    │   ├── rcrowley
    │   ├── robertkrimen
    │   ├── smartystreets
    │   ├── spf13
    │   ├── tj
    │   └── valyala
    ├── golang.org
    │   └── x
    ├── google.golang.org
    │   ├── appengine
    │   ├── cloud
    │   └── grpc
    └── gopkg.in
       ├── bsm
       ├── redis.v3
       ├── sourcemap.v1
       └── yaml.v2
    
    35 directories

    And now goimports is really slow:

    $ time goimports routes/events.go 1>/dev/null
    goimports routes/events.go > /dev/null  3.45s user 9.69s system 331% cpu 3.964 total

    However if I remove the vendored library and get the dependencies into my $GOPATH:

    rm -r vendor
    go get

    goimports is really fast again:

    $ time goimports routes/events.go 1>/dev/null
    goimports routes/events.go  1>/dev/null  0.01s user 0.01s system 68% cpu 0.032 total
  4. What did you expect to see? Same performance on vendored libs and libs in $GOPATH.
  5. What did you see instead? A large performance difference.
bradfitz commented 8 years ago

Good timing. I was annoyed by goimports' performance recently and started investigating today during the Gophercon hack day. I have a change on my laptop to make things much faster.

It's doing way more work than necessary.

josharian commented 8 years ago

Can't wait for the CL.

gopherbot commented 8 years ago

CL https://golang.org/cl/24941 mentions this issue.

gopherbot commented 8 years ago

CL https://golang.org/cl/24948 mentions this issue.

gopherbot commented 8 years ago

CL https://golang.org/cl/24971 mentions this issue.

gopherbot commented 8 years ago

CL https://golang.org/cl/25001 mentions this issue.

bradfitz commented 8 years ago

I think it's fast enough to close this now.