Build speed has increased after adding ecto

I’m building an API with Phoenix and I noticed that the build time of the application has increased a lot. It passed from less than 1mn after adding Ecto to almost 15mn.
There more libraries than in the beginning but is that normal?

3 Likes

Do you mean the time to compile the application, the time to compile the application and deps, or time to run the tests?

Also is 1mn 1 minute? :slight_smile:

2 Likes

in either case, this is abnormal I think. Must be something wrong. @freiden how did you install Erlang and Elixir. I think messing up with Erlang compilation flags is most likely to cause slow compile times.

2 Likes

it may be similar issue @michalmuskala had:

4 Likes

I’m developing my application in a Docker Alpine container using erlang-18.3.2-r0.
I didn’t change the default flag of the installation.

2 Likes

Well that really should be updated, erlang-19 had a lot of features and bug fixes, however that is likely not the issue. :slight_smile:

Assuming your erlang is not build in such a way so that it will compile slow then the next #1 cause for slow compilation is a huge dependency graph. You can print out the dependency graph with mix xref graph --format dot to output a standard graphviz dot file if you want to generate an image, or you can use pretty or plain for different text output styles. The more things that depend on something then they all have to be recompiled. If you see one file that a lot of things depend on and you change that file a lot, then all of those dependents will also need recompiling (as well as their dependents and their dependents and so on), if that happens then break up the files more.

You can also try compiling while setting the long-compilation-threshold to something fairly short to see what files are taking a long time to compile, something like mix compile --long-compilation-threshold 1 for any file that takes above 1 second (and work your way up to see less files listed), and you can add --force to recompile your files even if it is not needed if you want to test all.

3 Likes

Here’s diff of the compile flags that I was using before & after to compile erlang https://github.com/michalmuskala/dotfiles/commit/586bee203e11a34e22ebc75ba8d28e39cb99eb0a#diff-f6b55af9f4628f5b451fcab5bcdb6937

I’m not sure what exactly made the difference.

1 Like

maybe… all of them? I think you need to use either “export” or “env” to actually set the build configuration for kerl.

In your original .kerlrc you had only local script variable set, and I think it did not work.

1 Like

That might be very well true :sweat_smile:

3 Likes

I have generated the dependency graph and it have 332 references on my Phoenix project shared between views, controllers, models, custom mix tasks, libs, plugs and the router (around 80 files).
Is it so big?

1 Like

@freiden how long just mix deps.compile take?

2 Likes

Hi Jose,

Most of the time the compilation is of less than 4 minutes. I updated my container to use erlang 19 and elixir 1.4.2.
I’ve tested the project multiple time these days and the complete build take less than 6 minutes with migrations.

1 Like