Skip to content

Search dependency manager priority directly - #15944

Merged
josevalim merged 1 commit into
elixir-lang:mainfrom
preciz:perf/dep-sort-manager
Sep 25, 2026
Merged

josevalim merged 1 commit into
elixir-lang:mainfrom
preciz:perf/dep-sort-manager

Conversation

@preciz

@preciz preciz commented Sep 25, 2026

Copy link
Copy Markdown
Contributor

Assisted-by: Codex:GPT-6
Assisted-by: Antigravity:Gemini 3.8 Flash

Search dependency manager priority directly in Mix.Dep.Converger.

Bench:

# Run with: ./bin/elixir bench.exs
Mix.install([:benchee])

defmodule Baseline do
  @managers [:mix, :rebar3, :make]

  def sort_manager(other_manager, manager, false) do
    to_exclude = @managers -- (List.wrap(other_manager) ++ List.wrap(manager))
    List.first(@managers -- to_exclude) || other_manager || manager
  end
end

defmodule Proposed do
  @managers [:mix, :rebar3, :make]

  def sort_manager(other_manager, manager, false) do
    Enum.find(@managers, &(&1 == other_manager or &1 == manager)) || other_manager || manager
  end
end

defmodule Bench do
  def baseline({m1, m2}), do: Baseline.sort_manager(m1, m2, false)
  def proposed({m1, m2}), do: Proposed.sort_manager(m1, m2, false)
end

inputs = %{
  ":mix / :rebar3" => {:mix, :rebar3},
  "nil / :mix" => {nil, :mix},
  ":custom_a / :custom_b" => {:custom_a, :custom_b},
  "nil / nil" => {nil, nil}
}

Benchee.run(
  %{
    "main" => &Bench.baseline/1,
    "HEAD" => &Bench.proposed/1
  },
  inputs: inputs,
  time: 2,
  warmup: 1,
  memory_time: 1
)

Results:

Operating System: Linux
CPU Information: AMD Ryzen 7 8845HS w
Number of Available Cores: 16
Available memory: 54.72 GB
Elixir 1.21.0-dev
Erlang 29.0.5
JIT enabled: true

##### With input :mix / :rebar3 #####
Name           ips        average  deviation         median         99th %
HEAD       17.18 M       58.21 ns  ±9801.75%          40 ns          71 ns
main       10.73 M       93.17 ns  ±3842.83%          80 ns         140 ns

Comparison: 
HEAD       17.18 M
main       10.73 M - 1.60x slower +34.97 ns

Memory usage statistics:

Name    Memory usage
HEAD            32 B
main            96 B - 3.00x memory usage +64 B

**All measurements for memory usage were the same**

##### With input nil / :mix #####
Name           ips        average  deviation         median         99th %
HEAD       18.32 M       54.60 ns ±10238.03%          40 ns          61 ns
main       10.75 M       93.02 ns  ±3058.62%          80 ns         170 ns

Comparison: 
HEAD       18.32 M
main       10.75 M - 1.70x slower +38.42 ns

Memory usage statistics:

Name    Memory usage
HEAD            32 B
main            64 B - 2.00x memory usage +32 B

**All measurements for memory usage were the same**

##### With input :custom_a / :custom_b #####
Name           ips        average  deviation         median         99th %
HEAD       13.76 M       72.69 ns  ±7902.66%          50 ns         100 ns
main       10.10 M       99.01 ns  ±3353.54%          90 ns         180 ns

Comparison: 
HEAD       13.76 M
main       10.10 M - 1.36x slower +26.32 ns

Memory usage statistics:

Name    Memory usage
HEAD            32 B
main            96 B - 3.00x memory usage +64 B

**All measurements for memory usage were the same**

##### With input nil / nil #####
Name           ips        average  deviation         median         99th %
HEAD       13.66 M       73.23 ns  ±7705.56%          50 ns         110 ns
main       11.16 M       89.58 ns  ±3106.03%          80 ns         141 ns

Comparison: 
HEAD       13.66 M
main       11.16 M - 1.22x slower +16.36 ns

Memory usage statistics:

Name    Memory usage
HEAD            32 B
main             0 B - 0.00x memory usage -32 B

**All measurements for memory usage were the same**

Replace wrapping, concatenating and subtracting manager lists with a priority search while preserving upper-level precedence and fallback.

Assisted-by: Codex:GPT-6
Assisted-by: Antigravity:Gemini 3.8 Flash
@josevalim
josevalim merged commit 4f30a49 into elixir-lang:main Sep 25, 2026
15 checks passed
@josevalim

Copy link
Copy Markdown
Member

💚 💙 💜 💛 ❤️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants