# \[ANN\] Fezzik.jl : Brute force sysimg building for Julia

**URL:** https://discourse.julialang.org/t/ann-fezzik-jl-brute-force-sysimg-building-for-julia/21424
**Category:** Community
**Tags:** announcement
**Created:** [March 3, 2019, 12:10pm UTC](https://discourse.julialang.org/t/ann-fezzik-jl-brute-force-sysimg-building-for-julia/21424 "2019-03-03T12:10:06Z")
**Posts on this page:** 8
**Page:** 1

<div class="post-metadata">

### Author: ![TsurHerman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tsurherman/32/1234_2.png) [@TsurHerman](https://discourse.julialang.org/u/TsurHerman)
#### Post date: [March 3, 2019, 12:10pm UTC](https://discourse.julialang.org/t/ann-fezzik-jl-brute-force-sysimg-building-for-julia/21424/1 "2019-03-03T12:10:06Z")

</div>

Provides a hassle-free way of generating a snappy first use experience with Julia , without going into technicalities, I wrote this package to help co-workers who uses Julia for their everyday reaserch

### Fezzik

Make Julia fast again

### Installation

```julia
using Pkg
pkg"add https://github.com/TsurHerman/Fezzik"

```

### Usage

one time setup

```julia
using Fezzik
Fezzik.auto_trace()

```

enables automatic tracing of compiler activity through adding itself  
to the startup.jl file.  
After this phase you’ll need to re-launch julia , work a little bit to let Fezzik trace your routine and then:

```julia
Fezzik.brute_build_julia()

```

builds a new julia system image with all the traced statements baked into the system image resulting in a much smoother experience with julia for the small price of slightly increased loading time, If you are working with Juno’s cycler mode then this price is nicely hidden from you.

```julia
using Fezzik
blacklist("Mypkg1","Mypkg2")

```

A persistant blacklist that prevents Fezzik from precompiling statements from your currently in-development modules, as baking them into the sysimg prevents you from seeing changes you make to the code

```julia
using Fezzik
blacklist()

```

call blacklist with no arguments to see all blacklisted modules

```julia
using Fezzik
whitelist("Mypkg1","Mypkg2")

```

make white what was once black

```julia
Fezzik.auto_trace(false)

```

remove itself from the startup.jl and deletes previous traces

trace logs can be found by running the following command

```julia
abspath(dirname(pathof(Fezzik)),"../","traces") |> edit

```

### PyPlot

to enable PyPlot showing properly after it was baked into the sytem image  
add

```julia
PyPlot.ion()

```

to your startup.jl

### Revert

every now and then you’ll want to start over , just call

```julia
Fezzik.revert()

```

to go back to the beginning

---

<div class="post-metadata">

### Author: ![leethargo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/leethargo/32/6004_2.png) [@leethargo](https://discourse.julialang.org/u/leethargo)
#### Post date: [March 3, 2019, 2:01pm UTC](https://discourse.julialang.org/t/ann-fezzik-jl-brute-force-sysimg-building-for-julia/21424/2 "2019-03-03T14:01:55Z")

</div>

Available on [GitHub](https://github.com/TsurHerman/Fezzik).

---

<div class="post-metadata">

### Author: ![oheil](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oheil/32/220745_2.png) [@oheil](https://discourse.julialang.org/u/oheil)
#### Post date: [March 3, 2019, 4:36pm UTC](https://discourse.julialang.org/t/ann-fezzik-jl-brute-force-sysimg-building-for-julia/21424/3 "2019-03-03T16:36:58Z")

</div>

You ARE the brute squad!  
💪👍

---

<div class="post-metadata">

### Author: ![chakravala](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chakravala/32/6832_2.png) [@chakravala](https://discourse.julialang.org/u/chakravala)
#### Post date: [March 3, 2019, 7:18pm UTC](https://discourse.julialang.org/t/ann-fezzik-jl-brute-force-sysimg-building-for-julia/21424/4 "2019-03-03T19:18:44Z")

</div>

How does it interact with package updates?

---

<div class="post-metadata">

### Author: ![sdanisch](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sdanisch/32/1406_2.png) [@sdanisch](https://discourse.julialang.org/u/sdanisch)
#### Post date: [March 3, 2019, 8:27pm UTC](https://discourse.julialang.org/t/ann-fezzik-jl-brute-force-sysimg-building-for-julia/21424/5 "2019-03-03T20:27:14Z")

</div>

Great package, I did enjoy that kind of API 🙂

> [@TsurHerman](#):
>
> small price of slightly increased loading time

That should likely come from creating a new system image from scratch, missing AOT compiled functions that come with the standard system image. If you use `PackageCompiler.compile_incremental(nothing, trace_file.jl)`, this should include them! Make sure though, that you don’t compile from an image that already got compiled incremental - that seems to be problematic (not sure if impossible, or just very easy to break).

---

<div class="post-metadata">

### Author: ![TsurHerman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tsurherman/32/1234_2.png) [@TsurHerman](https://discourse.julialang.org/u/TsurHerman)
#### Post date: [March 3, 2019, 8:40pm UTC](https://discourse.julialang.org/t/ann-fezzik-jl-brute-force-sysimg-building-for-julia/21424/6 "2019-03-03T20:40:07Z")

</div>

> [@chakravala](#):
>
> How does it interact with package updates?

It does not, if a package was baked in and you updated it , you’ll need to revert and start again

---

<div class="post-metadata">

### Author: ![TsurHerman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tsurherman/32/1234_2.png) [@TsurHerman](https://discourse.julialang.org/u/TsurHerman)
#### Post date: [March 3, 2019, 8:46pm UTC](https://discourse.julialang.org/t/ann-fezzik-jl-brute-force-sysimg-building-for-julia/21424/7 "2019-03-03T20:46:37Z")

</div>

> [@sdanisch](#):
>
> `PackageCompiler.compile_incremental(nothing, trace_file.jl)` , this should include them!

This is what Fezzik does(thanks for taking care of package compiler) , hmm I use it to build incrementally a few times with no problem , and if things break … go back to the beginning.  
There is another interesting function, sysimg\_size() which gives you the current sysimg size … you can see it rise in the numbers after every build.

---

<div class="post-metadata">

### Author: ![sdanisch](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sdanisch/32/1406_2.png) [@sdanisch](https://discourse.julialang.org/u/sdanisch)
#### Post date: [March 3, 2019, 8:48pm UTC](https://discourse.julialang.org/t/ann-fezzik-jl-brute-force-sysimg-building-for-julia/21424/8 "2019-03-03T20:48:22Z")

</div>

> It does not, if a package was baked on and you updated it , you’ll need to revert and start again

there should be an relatively easy hack to teach revise to just compile the diff on startup… Likely needs some work to make Revise talk with PackageCompiler/Fezzik…

> This is what Fezzik does

Ah great 🙂 Seemed like it eliminated most load time regression for my cases…
