Is this an issue with the new type checker?

Today I encountered an issue.
After updating Elixir from version 1.17.3 to 1.18.3, the compilation time of my project increased dramatically (about 10 times longer).

After digging through the code, I managed to reproduce this issue with the following synthetic code:

# update_map_test.ex
defmodule UpdateMapTest do
  def cast(value) do
    result = %{
      a01: nil,
      a02: nil,
      a03: nil,
      a04: nil,
      a05: nil,
      a06: nil,
      a07: nil,
      a08: nil,
      a09: nil,
      a10: nil,
      a11: nil,
      a12: nil,
      a13: nil,
      a14: nil,
      a15: nil,
    }

    result = if value[:a], do: %{result | a01: value[:a]}, else: result
    result = if value[:a], do: %{result | a02: value[:a]}, else: result
    result = if value[:a], do: %{result | a03: value[:a]}, else: result
    result = if value[:a], do: %{result | a04: value[:a]}, else: result
    result = if value[:a], do: %{result | a05: value[:a]}, else: result
    result = if value[:a], do: %{result | a06: value[:a]}, else: result
    result = if value[:a], do: %{result | a07: value[:a]}, else: result
    result = if value[:a], do: %{result | a08: value[:a]}, else: result
    result = if value[:a], do: %{result | a09: value[:a]}, else: result
    result = if value[:a], do: %{result | a10: value[:a]}, else: result
    result = if value[:a], do: %{result | a11: value[:a]}, else: result
    result = if value[:a], do: %{result | a12: value[:a]}, else: result
    result = if value[:a], do: %{result | a13: value[:a]}, else: result
    result = if value[:a], do: %{result | a14: value[:a]}, else: result
    result = if value[:a], do: %{result | a15: value[:a]}, else: result

    {:ok, result}
  end
end
$ elixir -v
Erlang/OTP 27 [erts-15.2.5] [source] [64-bit] [smp:32:12] [ds:32:12:10] [async-threads:1] [jit:ns]

Elixir 1.18.3 (compiled with Erlang/OTP 27)

$ time elixir update_map_test.ex

real    0m9,085s
user    0m10,075s
sys     0m0,694s
$ elixir -v
Erlang/OTP 27 [erts-15.2.5] [source] [64-bit] [smp:32:12] [ds:32:12:10] [async-threads:1] [jit:ns]

Elixir 1.17.3 (compiled with Erlang/OTP 27)

$ time elixir update_map_test.ex

real    0m0,342s
user    0m0,853s
sys     0m0,322s

Interestingly, when adding new fields and updates, the compilation time seems to grow exponentially.

I would suggest opening a GitHub issue, the core team will be able to identify if its an issue, or could potentially already be fixed, but not released.

Ok.

2 Likes