gomvpkg-lightというパッケージを作った

github.com

作りました。

発端

まとめると

  • もう少し速さが欲しい
  • 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