warmwaffles

warmwaffles

We have a rather large code base ~2200 elixir files and growing. On my nice Ryzen 9, it takes ~47 seconds to analyze the generated PLT files. Our config looks like this:

  defp dialyzer(env) do
    [
      plt_add_apps: [:mix, :ex_unit],
      flags: ~w(
        error_handling
        extra_return
        missing_return
      )a,
      plt_file: {:no_warn, "priv/plts/dialyzer-#{env}.plt"},
      list_unused_filters: true
    ]
  end

In our CI environment, dialyzer is taking ~2 minutes. I blame the underlying server equipment here, but locally this is painfully slow to run and to build the PLTs take even longer than our test suite does to run. (14,000+ tests ~100 seconds).

What are some strategies that others have employed to speed this up or help the dialyzer along? One mentioned was to avoid opaque types.

Showing Posts 1 to 4

christhekeele

christhekeele

You can build just the PLTs without doing analysis via dialyzer --plt. I work this into my cache system (varies by CI provider) with a cache key based on elixir + erlang versions and a hash of mix.lock; so PLTs only build when any of those change. This amortizes your PLT build times over just commits that would require rebuilding PLTs by busting the cache.

Generally,

  1. Try to restore PLT cache based on language/library versions
  2. Build the PLTs on cache miss
  3. Run dialyzer normally using cached/newly built PLTs

Steps 1 and 3 are fast and the happy path. In practice this looks like (for Github-flavored CI):

- name: Restore mix typecheck cache
  id: mix-typecheck-cache
  uses: actions/cache@v4
  with:
    path: priv/plts
    key: plts-otp-${{ steps.beam-versions.outputs.otp-version }}-elixir-${{ steps.beam-versions.outputs.elixir-version }}-mix-lock-file-${{ hashFiles(format('{0}{1}', github.workspace, '/mix.lock')) }}

- name: Setup typechecking
  if: steps.mix-typecheck-cache.outputs.cache-hit != 'true'
  run: mix dialyzer --plt --format dialyxir

- name: Run typecheck tasks
  run: mix dialyzer --format dialyxir
warmwaffles

warmwaffles OP

Yea we definitely cache the PLTs prior, but the cache is busted if mix lock is changed.

christhekeele

christhekeele

Ah i see. I have no experience trying to accelerate the generation of PLTs beyond caching, as that’s always been sufficient for the projects I’ve worked on. Does your mix.lock change often enough for this to remain a problem day-to-day?

warmwaffles

warmwaffles OP

Unfortunately we have ~181 dependencies and we do bump deps frequently. I should also mention that the caching also is calculated based on tool-version, all the config files (we have conditional compilation yay), and this mix lock.

— All posts loaded —

Where Next? Top

Trending in Discussions Top

AstonJ
As the title says, please share what you’ve been up to with Elixir. Whether that’s been learning it, looking into it, making stuff with i...
2977 94592 917
New
cblavier
Hey there, It’s been more than a year since we started using LiveView as our main UI library and building a whole library of UI componen...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
heathen
Quite interesting article Google brought me. Didn’t find any mentions about it here. What do you think in general? Would you use togethe...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
AstonJ
Since we have deprecated our Erlang sections (as we have dedicated Erlang Forums now) let’s add this thread for those who’d like to post ...
New
Null-logic-0
What IDE or editor are you using for Elixir development? Personally, I use Zed, and I really like it, but sometimes I wish there were a ...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Dmk
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
webofbits
With AI doing more of the implementation work, I’ve been wondering how much coding I should deliberately keep doing myself. My main conc...
#ai
New

Latest on Elixir Forum

Elixir Forum

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews