LoginSignup
13
4

More than 5 years have passed since last update.

大量のgo getを少し速くする技

Posted at

dep やら vgo やらが時代の潮流のようですが、開発ツールに関しては地道に go get で落としている人も多いと思います。

こういう時、go getコマンドを何度も実行するよりも…

go_get_1.sh
go get -v -u golang.org/x/tools/cmd/goimports
go get -v -u honnef.co/go/tools/cmd/staticcheck
go get -v -u github.com/kisielk/errcheck
go get -v -u bitbucket.org/liamstask/goose/cmd/goose
go get -v -u github.com/knq/xo
go get -v -u github.com/joho/godotenv/cmd/godotenv
go get -v -u github.com/githubnemo/CompileDaemon

こんな風に1回の go get に複数パッケージを並べて書いたほうが高速にダウンロードできるようです。

go_get_2.sh
go get -v -u \
   golang.org/x/tools/cmd/goimports \
   honnef.co/go/tools/cmd/staticcheck \
   github.com/kisielk/errcheck \
   bitbucket.org/liamstask/goose/cmd/goose \
   github.com/knq/xo \
   github.com/joho/godotenv/cmd/godotenv \
   github.com/githubnemo/CompileDaemon

雑な比較

$ time bash go_get_1.sh
# (中略)
real    0m41.743s
user    0m5.775s
sys     0m5.135s

$ time bash go_get_2.sh
# (中略)
real    0m32.035s
user    0m3.600s
sys     0m3.095s

速くなる理由

go getは依存関係にあるパッケージも自動的に取得してくれます。
複数のパッケージを一気に指定すると、いくつかのパッケージから共通して依存されているパッケージを1回だけ落とすようになるため、その分ちょっと効率的になるようですね。

なので、共通部分が多いパッケージ群だと、効果はばつぐんだ!

$ time bash -c 'go get -u google.golang.org/grpc/examples/helloworld/greeter_server && go get -u google.golang.org/grpc/examples/helloworld/greeter_client'

real    0m29.332s
user    0m2.587s
sys     0m2.430s


$ time bash -c 'go get -u google.golang.org/grpc/examples/helloworld/greeter_server google.golang.org/grpc/examples/helloworld/greeter_client'

real    0m13.669s
user    0m1.252s
sys     0m1.260s

↑gRPCのサンプルのserverとclientですが、依存関係はほぼ共通なので、ダウンロード時間が約半分に減ってますね。

あとはそもそも、 -u 付けなくていいのでは?みたいなのも考慮に入れるといいかと。

13
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
4