PackageCompilerX で Plots.jl の呼び出しを高速にする．

# Deprecation Warning

- この記事のトピックは古くなりました．
- PackageCompilerX.jl は 旧 PackageCompiler.jl のリポジトリにまるごと移行し新しいPackageCompiler.jlに置き換わりました．
    - 参考 https://github.com/JuliaLang/PackageCompiler.jl/pull/304
- したがって PackageCompilerX.jl はアーカイブされ今後メンテナンス，Issueの議論は PackageCompiler.jl にて行われることになります．

以前もしも，参考にされた方は PackageCompilerX.jl の追加のロジックは全て下記に置き換えてください．

```console
$ julia -q
julia> ; # press ; to enter pkg-mode
pkg> rm PackageCompiler # 古いものを削除
pkg> rm PackageCompilerX # 削除
pkg> gc
julia> # 再び戻る
julia> using Pkg
julia> Pkg.add(PackageSpec(url="https://github.com/JuliaLang/PackageCompiler.jl",rev="master"))'
julia> using PackageCompiler # using PackageCompilerX としていた箇所を全て X を取り除く
```

# 本日は

- Julia の公式 Slack で static-compilation というチャンネルがあります． 今日の議論で PackageCompilerX で Plots の読み込みを高速化できる？っていう質問があってYesという回答があったのでそれを真似できたことを報告するものです．
- 以前私の記事でも `PacakgeCompiler` の方で Plots.jl の読み込みを高速化する方法を書きましたが， PackageCompiler 自体がメンテナンスがおそろかになっているせいか Julia 1.3 で動作がうまく出来なくなりました． `PackageCompilerX.jl` はそれに代る新しいパッケージとして開発が進んでいますのでそちらをウォッチするのがいいと思います．
- PackageCompilerX は Jeff さんのジンギスカンパーティで存在を教えてもらいました．

# 環境

```julia
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.3.0 (2019-11-26)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

julia> versioninfo()
Julia Version 1.3.0
Commit 46ce4d7933 (2019-11-26 06:09 UTC)
Platform Info:
  OS: macOS (x86_64-apple-darwin19.0.0)
  CPU: Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-6.0.1 (ORCJIT, skylake)
Environment:
  JULIA_EDITOR = subl
```

# 手順

## １. PackageCompierX.jl を眺める 

- https://github.com/KristofferC/PackageCompilerX.jl

にいってチュートリアルを試しておきます．ひとまず OhMyREPL の使用が快適になると思います．

## 2. 下記のスクリプトを用意します．

- やっていることは PackageCompiler.jl をつかったときにはまった libGR.so/dylib のような共有ライブラリのパスをおしえています。（手元のMacではこうしないとできませんでした）
- コメントでも記載しましたが、お使いのJuliaを 1.3.1 に昇格するとこの煩雑なスクリプトは不要です。Julia 1.3.0 をつかっているユーザはこの機会にJuliaのバージョンをアップグレードしておきましょう。

```julia:speedupplots.jl
using Pkg
Pkg.add(["GR", "Plots"])
pkg"add https://github.com/KristofferC/PackageCompilerX.jl"
using PackageCompilerX
using GR

if Sys.iswindows()
    s=joinpath(dirname(dirname(pathof(GR))),"deps","gr","bin")
    s*=';'
    if !endswith(ENV["PATH"],';')
        ENV["PATH"] *= ';'
    end
    ENV["PATH"] *= s
else
    s=joinpath(dirname(dirname(pathof(GR))),"deps","gr","lib")
    s*=':'
    if haskey(ENV, "LD_LIBRARY_PATH")
        ENV["LD_LIBRARY_PATH"] *= s
        if !endswith(ENV["LD_LIBRARY_PATH"],':')
            ENV["LD_LIBRARY_PATH"] *= ':'
        end
    else
        ENV["LD_LIBRARY_PATH"] = s
    end
end

create_sysimage([:Plots, :GR], sysimage_path="plots.so")
```


# 3. 実行方法


```console
$ julia speedupplots.jl
$ ls
plots.so
```

ひとまず `plots.so` というものができました。Juliaの実行の時に `-J` オプションで `plots.so` のパスを指定しておくと幸せになれます。


```console
$ julia -J plots.so
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.3.0 (2019-11-26)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

julia> using Plots # ここの読み込みがすごく速くなる

julia> plot([1,2,3]) # Plots.jl が提供している関数群の呼び出しもすごく速くなる。
```

以上

めっちゃ快適になったと思います．Plotsにかぎらず、 Dataframes のような重めのパッケージもサクサクさせることができるはずです。お試しあれ。

 Enjoy your Julia life!!!

# おまけ

- [MyWorkflow.jl](https://github.com/terasakisatoshi/MyWorkflow.jl) という私のリポジトリでは PackageCompilerX を利用してJuliaのパッケージのロードを速くする環境を構築するDockerfileを提供しています。

- 最近ではデータサイエンス向けのパッケージをあらかじめコンパイルしておこうぜというDockerイメージが有志によって公開されているようです。

https://hub.docker.com/r/xiaodaidocker2019/julia-data-science-base