Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

perf(linter): jest/prefer-hooks-in-order: rewrite rule to allocate less and iterate fewer times #6030

Conversation

camchenry
Copy link
Contributor

@camchenry camchenry commented Sep 24, 2024

Profiling this in a single-threaded run showed this rule to be relatively slow compared to other rules:

image

The profile shows that a lot of time is spent doing pushes on Vec:
image

I believe this is because we were essentially duplicating the entirety of ctx.nodes(), and then iterating over it again for the actual rule.

I addressed this by:

  • We no longer store any nodes (we only store the previous hook span + order), which saves many allocations.
  • We only iterate over the nodes once and store the previous hook function in a per-scope hash map. This should be faster since we now only do n iterations, instead of 2n iterations.

Benchmarking on the microsoft/vscode repository shows that this is probably faster (by up to ~3%), and probably not any slower:

Screenshot 2024-09-24 at 12 06 32 PM

The snapshot change in this PR is due to slightly different ordering, I think, but it appears to be the same diagnostics overall.

Copy link
Contributor Author

camchenry commented Sep 24, 2024

@github-actions github-actions bot added the A-linter Area - Linter label Sep 24, 2024
Copy link

graphite-app bot commented Sep 24, 2024

Your org has enabled the Graphite merge queue for merging into main

Add the label “0-merge” to the PR and Graphite will automatically add it to the merge queue when it’s ready to merge. Or use the label “hotfix” to add to the merge queue as a hot fix.

You must have a Graphite account and log in to Graphite in order to use the merge queue. Sign up using this link.

Copy link

codspeed-hq bot commented Sep 24, 2024

CodSpeed Performance Report

Merging #6030 will not alter performance

Comparing 09-24-perf_linter_jest_prefer-hooks-in-order_rewrite_rule_to_allocate_less_and_iterate_fewer_times (c16ae60) with main (d05fd20)

Summary

✅ 29 untouched benchmarks

@DonIsaac DonIsaac added the 0-merge Merge with Graphite Merge Queue label Sep 24, 2024 — with Graphite App
Copy link

graphite-app bot commented Sep 24, 2024

Merge activity

…less and iterate fewer times (#6030)

Profiling this in a single-threaded run showed this rule to be relatively slow compared to other rules:

<img width="907" alt="image" src="https://github.com/user-attachments/assets/789cdc1f-d1ce-4d4a-bfa3-5882bd92cfc4">

The profile shows that a lot of time is spent doing pushes on `Vec`:
<img width="896" alt="image" src="https://github.com/user-attachments/assets/cde361d7-091d-42db-abc2-76a0c8a7fa44">

I believe this is because we were essentially duplicating the entirety of `ctx.nodes()`, and then iterating over it again for the actual rule.

I addressed this by:

- We no longer store any nodes (we only store the previous hook span + order), which saves many allocations.
- We only iterate over the nodes once and store the previous hook function in a per-scope hash map. This should be faster since we now only do `n` iterations, instead of `2n` iterations.

Benchmarking on the `microsoft/vscode` repository shows that this is probably faster (by up to ~3%), and probably not any slower:

<img width="992" alt="Screenshot 2024-09-24 at 12 06 32 PM" src="https://github.com/user-attachments/assets/ab916464-1b50-48e1-a65d-f9b3a4b4607d">

The snapshot change in this PR is due to slightly different ordering, I think, but it appears to be the same diagnostics overall.
@DonIsaac DonIsaac force-pushed the 09-24-perf_linter_jest_prefer-hooks-in-order_rewrite_rule_to_allocate_less_and_iterate_fewer_times branch from d18594c to c16ae60 Compare September 24, 2024 17:51
@graphite-app graphite-app bot merged commit c16ae60 into main Sep 24, 2024
26 checks passed
@graphite-app graphite-app bot deleted the 09-24-perf_linter_jest_prefer-hooks-in-order_rewrite_rule_to_allocate_less_and_iterate_fewer_times branch September 24, 2024 17:55
@oxc-bot oxc-bot mentioned this pull request Sep 27, 2024
Boshen added a commit that referenced this pull request Sep 27, 2024
## [0.9.9] - 2024-09-27

### Bug Fixes

- bd8f786 linter: Rule and generic filters do not re-configure existing
rules (#6087) (DonIsaac)
- c5cdb4c linter: Disable all rules in a plugin when that plugin gets
turned off (#6086) (DonIsaac)
- 6c855af linter: Only write fix results if source code has changed
(#6096) (DonIsaac)
- 8759528 linter: Category filters not re-configuring already-enabled
rules (#6085) (DonIsaac)
- c2616f7 linter: Fix panic in fixer for `oxc/only-used-in-recursion`
(#6070) (camc314)
- 3da3845 linter: Malformed snippets in `eslint/for-direction` docs
(#6060) (DonIsaac)
- c047d42 linter: `no-useless-escape`: do not crash on backslash
character (#6048) (camchenry)
- 6f76ebe linter: Ignore invalid or partial disable directives (#6045)
(camchenry)
- 09a24cd linter: Fix false positives for generics in
`no-unexpected-multiline` (#6039) (camchenry)
- d05fd20 linter: Newline in type parameters causing false positive in
`no-unexpected-multiline` (#6031) (DonIsaac)
- 01b9c4b npm/oxlint: Make bin/oxc_language_server an executable (#6066)
(Boshen)

### Performance

- f8464a3 linter: `no-magic-numbers` remove redudant checks in
`is_array_index` (#6033) (Alexander S.)
- c16ae60 linter: `jest/prefer-hooks-in-order`: rewrite rule to allocate
less and iterate fewer times (#6030) (camchenry)

### Documentation

- a4fdf1b linter: Improve docs for promise rules (#6051) (dalaoshu)
- 21cdb78 linter: Fix incorrect "bad" example in
`only-used-in-recursion` (#6029) (Boshen)

### Refactor

- 1f92d61 linter: `jest/prefer-hooks-in-order`: improve diagnostic
messages (#6036) (camchenry)

### Testing

- 55949eb linter: Add `OxlintRules::override_rules` tests (#6081)
(DonIsaac)
- 1a6923a linter: Add filter parsing test cases (#6080) (DonIsaac)
- 58d333a linter: Add more test cases for disable directives (#6047)
(camchenry)

---------

Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
0-merge Merge with Graphite Merge Queue A-linter Area - Linter
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants