Skip to content

Loader optimizations#11238

Open
josevalim wants to merge 2 commits into
erlang:masterfrom
josevalim:jv-loader-opt
Open

Loader optimizations#11238
josevalim wants to merge 2 commits into
erlang:masterfrom
josevalim:jv-loader-opt

Conversation

@josevalim

Copy link
Copy Markdown
Contributor

This pull request includes two commits that optimize code loading. I recommend viewing the commits in isolation, I can also submit each as a separate pull request if preferred.

Disclaimer: @hugobarauna used Claude Fable to find possible improvements. I have then separately verified the improvements on another machine and refactored them into two isolated commits.

The initial exploration also surfaced a significant improvement on code staging but I don't feel confident judging that one.

Replace the per-label hash map used during JIT code loading with a
vector indexed by label number. The loader allocates the label table
once after the label count is known, making repeated label address
lookups direct indexed loads instead of hash lookups while preserving
the existing label-number validation.

Benchmark: generated 100 modules with 100 exported functions each and
timed 80 iterations of purging and loading all modules in order via
code:load_abs/1 on aarch64-apple-darwin24.6.0. Baseline median/avg/p90:
41,211 / 41,633 / 44,106 us. Candidate median/avg/p90:
37,577 / 38,243 / 40,859 us.
JIT metadata line entries already reference source files by index in
the module line table. Preserve that shape in the intermediate JIT
metadata representation by storing one converted file table alongside
the ranges, and have each LineData entry keep the file index.

This avoids converting and copying the same filename into every line
entry while keeping the final expansion at the GDB/perf metadata
writers, where those external formats require filename bytes.

Benchmark: generated 100 modules with 100 exported functions each and
timed 80 iterations of purging and loading all modules in order via
code:load_abs/1 on aarch64-apple-darwin24.6.0. Baseline median/avg/p90:
37,577 / 38,243 / 40,859 us. Candidate median/avg/p90:
36,122 / 36,664 / 39,144 us.
@github-actions

github-actions Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

CT Test Results

    3 files    136 suites   50m 19s ⏱️
1 678 tests 1 621 ✅ 56 💤 1 ❌
2 320 runs  2 245 ✅ 74 💤 1 ❌

For more details on these failures, see this check.

Results for commit 2a016a5.

♻️ This comment has been updated with latest results.

To speed up review, make sure that you have read Contributing to Erlang/OTP and that all checks pass.

See the TESTING and DEVELOPMENT HowTo guides for details about how to run test locally.

Artifacts

// Erlang/OTP Github Action Bot

@IngelaAndin IngelaAndin added the team:VM Assigned to OTP team VM label Jun 22, 2026
@bjorng bjorng self-assigned this Jun 22, 2026
@bjorng bjorng added the testing currently being tested, tag is used by OTP internal CI label Jun 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

team:VM Assigned to OTP team VM testing currently being tested, tag is used by OTP internal CI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants