gomvpkg-lightというパッケージを作った
作りました。
発端
gomvpkg-lightみたいなものを作りたい理由は2つあって。1つ目が遅い。2つ目が常にpackageの指定が再帰的に扱われるのがちょっと困るという感じ。
— po (@podhmo) 2018年4月6日
まとめると
- もう少し速さが欲しい
- packageを再帰的に移動してほしくない場合がある
成果
速さ
gcを切るみたいなズルも含めて2~3倍位早いと言うような感じにはなった。ちなみに対象としたソースコードは某社の某アプリケーション(ソースコードは非公開)。変換の過程で読み込まれたパッケージは標準ライブラリも全部込みで600近く(599)。
gomvpkg
$ time gomvpkg -from github.com/xxx/myapp/model -to github.com/xxx/myapp/model2 ... real 0m14.696s user 0m33.366s sys 0m8.601s
gomvpkg-light
$ gomvpkg-light --in github.com/xxx/myapp --from github.com/xxx/myapp/model --to github.com/xxx/myapp/model2 --disable-gc 2018/04/08 23:22:43 start move package github.com/xxx/myapp/model -> github.com/xxx/myapp/model2 2018/04/08 23:22:43 get in-pkg /home/nao/go/src/github.com/xxx/myapp 2018/04/08 23:22:43 collect candidate directories 683 2018/04/08 23:22:43 collect affected packages 132 2018/04/08 23:22:43 loading packages.. 2018/04/08 23:22:47 599 packages are loaded ... 2018/04/08 23:22:48 move package github.com/xxx/myapp/model -> github.com/xxx/myapp/model2 2018/04/08 23:22:48 takes 4.952462621s 2018/04/08 23:22:48 end real 0m5.283s user 0m11.218s sys 0m3.536s
小さめなコードの場合
ちなみにおそらくだけれど。gomvpkgのGOPATH以下を(ほとんど)全部走査するという固定費のようなコストが削減されるので。小さめのアプリケーションでの速度改善はもう少し大きいかもしれない。
例えば自分の手元のてきとうなパッケージを変更してみると
gomvpkg
$ gomvpkg -from github.com/podhmo/handwriting/generator/deriving -to github.com/podhmo/handwriting/deriving2 Renamed 2 occurrences in 1 file in 1 package. real 0m6.131s user 0m14.269s sys 0m6.464s
gomvpkg-light
$ gomvpkg-light --from github.com/podhmo/handwriting/generator/deriving --to github.com/podhmo/handwriting/deriving2 --in github.com/podhmo/handwriting ... real 0m1.263s user 0m3.223s sys 0m0.463s
(ちなみに --disable-gc
をつけると1秒切る程度になる)
packageを再帰的に移動してほしくない場合がある
packageを再帰的に移動してほしくない場合がある。というのはわかりやすく言えばサブパッケージを移動してほしくないということ。たとえば以下みたいなパッケージがあったとして。
github.com/podhmo/xxx/foo github.com/podhmo/xxx/foo/bar github.com/podhmo/xxx/foo/boo
fooをbazにmvpkgする時に以下のようになって欲しいことがあるということ。
github.com/podhmo/xxx/baz github.com/podhmo/xxx/foo/bar github.com/podhmo/xxx/foo/boo
このために --only
オプションを作った。以下のようにすると、fooだけを移動する。
$ gomvpkg-light --only --in github.com/podhmo/xxx --from github.com/podhmo/xxx/foo --to github.com/podhmo/xxx/baz