Skip to content

perf: use get_unchecked for TwoWaySearcher#155607

Merged
rust-bors[bot] merged 5 commits into
rust-lang:mainfrom
KowalskiThomas:kowalski/perf-use-get_unchecked-for-pattern
Jun 8, 2026
Merged

perf: use get_unchecked for TwoWaySearcher#155607
rust-bors[bot] merged 5 commits into
rust-lang:mainfrom
KowalskiThomas:kowalski/perf-use-get_unchecked-for-pattern

Conversation

@KowalskiThomas

@KowalskiThomas KowalskiThomas commented Apr 21, 2026

Copy link
Copy Markdown
Contributor

View all comments

What is this PR?

This is related to #27721.

This PR is a proposal for a performance improvement in std::pattern.

Profiling of https://github.com/quickwit-oss/quickwit in production shows that TwoWaySearcher::next is one of the most CPU-time-consuming functions, so I thought I would give it a look.
I read the contribution guide and this seems to be a fitting proposal.

It seems like TwoWaySearcher::next and TwoWaySearcher::next_back could be made faster by using get_unchecked in the inner loop comparisons instead of regular indexing, which is safe in the conditions where it would be done (indices are within bounds by construction).
I added some SAFETY comments in the code to explain why this is safe, as I believe is customary in those cases (and according to this page as well).

Benchmarks

I ran the existing bencharmks before/after the changes (only on my laptop, I can run them in other places if that's necessary).

./x.py bench library/coretests -- pattern::

We seem to be getting a ~7.5-12% performance improvement at a very low cost, which sounds worthwhile to me.
But this is the first time I'm proposing a change in Rust, so I'm looking forward to feedback on this.

BEFORE CHANGES
    pattern::ends_with_char   3398.91ns/iter +/- 526.28
    pattern::ends_with_str    3545.04ns/iter +/- 1108.76
    pattern::starts_with_char 3348.31ns/iter +/- 352.38
    pattern::starts_with_str  3710.59ns/iter +/- 435.57

AFTER CHANGES
    pattern::ends_with_char   3125.99ns/iter +/- 567.09  (-8.03%)
    pattern::ends_with_str    3106.43ns/iter +/- 258.33  (-12.38%)
    pattern::starts_with_char 3094.55ns/iter +/- 595.42  (-7.59%)
    pattern::starts_with_str  3365.75ns/iter +/- 268.88  (-9.29%)

System info for the benchmarks run

Details
Based on commit 8317fef20409adedaa7c385fa6e954867bf626fc

rustc 1.96.0-dev
binary: rustc
commit-hash: unknown
commit-date: unknown
host: aarch64-apple-darwin
release: 1.96.0-dev
LLVM version: 22.1.2

Apple M4 Max
16
64 GB
ProductName:		macOS
ProductVersion:		26.3
BuildVersion:		25D125
(this was run on AC and without any heavy load from other apps or whatnot)

@rustbot rustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Apr 21, 2026
@rust-log-analyzer

This comment has been minimized.

@KowalskiThomas KowalskiThomas force-pushed the kowalski/perf-use-get_unchecked-for-pattern branch from 6d37582 to 40692f5 Compare April 21, 2026 20:17
@KowalskiThomas KowalskiThomas marked this pull request as ready for review April 21, 2026 21:39
@rustbot rustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Apr 21, 2026
@rustbot rustbot removed the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Apr 21, 2026
@rustbot

rustbot commented Apr 21, 2026

Copy link
Copy Markdown
Collaborator

r? @Mark-Simulacrum

rustbot has assigned @Mark-Simulacrum.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: @scottmcm, libs
  • @scottmcm, libs expanded to 7 candidates
  • Random selection from Mark-Simulacrum, jhpratt, scottmcm

@Mark-Simulacrum Mark-Simulacrum left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Didn't review past the first block. In general it seems promising that you're seeing good perf improvement but I'm also hesitant to approve unsafe code in these fairly tricky string searching routines. I'm not sure how thorough our test coverage is on boundary conditions that would have caused panics in the indexing before... at minimum I don't think we have any fuzzing which would normally help build confidence.

cc @BurntSushi, I'm wondering if the out-of-tree(?) implementations for ripgrep/regex of the algorithms here have these optimizations applied?

View changes since this review

Comment thread library/core/src/str/pattern.rs Outdated
// `self.position + i < haystack.len()`.
// Every path that mutates `self.position` below either returns or re-enters `'search`,
// which re-runs the check before reaching the loop again.
// `i < needle.len()` also guarantees `needle.get_unchecked(i)` is safe.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you benchmark just changing the haystack indexing? It seems like LLVM should be able to make use of the for loops range being bounded by needle.len() to avoid that indexing actually staying in the final program.

The haystack bit (self.position + needle.len() <= haystack.len()) doesn't seem quite sufficient to me without deeper scrutiny of the underlying algorithm, since self.position is getting updated by a non-obviously +1 on each iteration... and if it was a +1 on each iteration, I'd guess LLVM would be able to simplify this itself?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, I'll give that a go!

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for taking so long to get back to you on this... Lots of things going on. Anyway, here are the results.

I have three versions of the code (that I pushed to the branch for now):

  • The baseline
  • My initial diff with get_unchecked on both haystack and needle
  • The partial diff with get_unchecked on haystack only (needle[i] stays checked)

One of the reasons I took so much time to do this is that running the benchmarks on my macOS laptop kept yielding noisy results and I wasn't sure exactly what to think about them, so I eventually moved to an Ubuntu box.

The results were sort of disappointing there (and I think that's exactly what you expected with LLVM figuring things out on its own) -- the diff is pretty much 0 for all existing benchmarks (although the improvement seems to be consistently showing on macOS).

... But maybe there was something else.


I decided to add different benchmarks.

The existing ones use a 42 bytes haystack and a 1 character needle with starts_with / ends_with. This actually doesn't do much with TwoWaySearcher.

Since the proposed changes optimise the inner loop in TwoWaySearcher::next (and TwoWaySearcher::next_back) which matter mostly for find / rfind with longer needles on longer haystacks, I added benchmarks that exercise that path. (So it's a ~30 KB haystack, and a 20 chars needle).

(The new benchmarks are on the branch as well.)


Those are the results (run on Linux).

Benchmark main Partial All changes Partial vs mainline All vs mainline
find_str 14,163 8,190 7,017 −42% −50%
rfind_str 23,360 11,800 8,306 −49% −64%
find_str_worst_case 1,103 1,104 1,399 ~0% +27%
rfind_str_worst_case 61,031 36,630 35,380 −40% −42%

So what it seems like is that

  • Having all the changes leads to slightly better results in most cases but a regression in one benchmark (and a somewhat significant one at that)
  • Keeping only the changes you suggested shows smaller improvements in most cases but regresses on no benchmark.

... So it might be worth pursuing this, but it also probably is worth pursuing it only partially.

@Mark-Simulacrum Mark-Simulacrum added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Apr 26, 2026
@KowalskiThomas

Copy link
Copy Markdown
Contributor Author

@Mark-Simulacrum Thanks for taking a look! I appreciate it.

I'm not sure how thorough our test coverage is on boundary conditions that would have caused panics in the indexing before... at minimum I don't think we have any fuzzing which would normally help build confidence.

Is there anything I could do to increase this confidence (regarding testing on edge cases and/or fuzzing)? If that requires additional work somewhere else and you're open to me contributing there, I'm definitely open to.

As I mentioned in the description, this function is currently a hotspot of ours and we'd really like to see it go faster.
Of course we could consider the rewrite route but that has obvious downsides of its own and they probably are way worse (for us) than doing what is needed to make the reference implementation faster (on top of making things better for others as well).

@KowalskiThomas KowalskiThomas force-pushed the kowalski/perf-use-get_unchecked-for-pattern branch from 40692f5 to 9c879de Compare May 28, 2026 16:14
@rustbot

rustbot commented May 28, 2026

Copy link
Copy Markdown
Collaborator

⚠️ Warning ⚠️

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels May 28, 2026
@rust-log-analyzer

This comment has been minimized.

@KowalskiThomas KowalskiThomas force-pushed the kowalski/perf-use-get_unchecked-for-pattern branch from 9c879de to 4627283 Compare May 28, 2026 16:23
@rust-log-analyzer

This comment has been minimized.

Comment thread library/core/src/str/pattern.rs Outdated
// loop applies: `haystack.get(self.position + needle_last)` at the
// top of `'search` established the bound for this iteration, and every mutation
// of `self.position` is followed by `continue 'search` (which re-runs the check)
// or a `return` on match.

@Mark-Simulacrum Mark-Simulacrum Jun 2, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this needs to say something about start / self.crit_pos, no? Otherwise it's not clear to me how to determine this is actually sound from this SAFETY comment.

View changes since the review

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this sound better?

// SAFETY: on every iteration of `'search`, the `haystack.get(self.position + needle_last)`
// check returned `Some`, so `self.position + needle_last < haystack.len()`.
// Since `i < self.crit_pos <= needle.len()`, we have `i <= needle_last`, and thus
// `self.position + i <= self.position + needle_last < haystack.len()`.
// Every path that mutates `self.position` below either returns or re-enters `'search`,
// which re-runs the check before reaching the loop again.

I initially was a bit handwavy in the interest of non being too long-winded; this version should be more explicit about why this is correct.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that seems better. Thanks!

// `self.position + i < haystack.len()`.
// Every path that mutates `self.position` below either returns or re-enters `'search`,
// which re-runs the check before reaching the loop again.
if needle[i] != unsafe { *haystack.get_unchecked(self.position + i) } {

@Mark-Simulacrum Mark-Simulacrum Jun 2, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The rationale here makes sense to me. I do wonder if we could tell LLVM enough that it would see it -- e.g. maybe subslicing needle and then having haystack[self.position..][..needle_slice.len()] would be enough? But I'm OK with this one as-is too.

View changes since the review

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried to do...

let haystack_window = &haystack[self.position..][..needle.len()];

... to then use it in the condition (I believe that's what you meant)...

if needle[i] != haystack_window[i] {

... but the benchmarks results ended up being way worse than the implementation currently on the PR (on the newly added benchmarks):

Benchmark Latest version of the PR LLVM trick Delta
find_str 8,190 ns 16,167 ns +97%
rfind_str 11,800 ns 10,539 ns −11%
find_str_worst_case 1,104 ns 2,070 ns +87%
rfind_str_worst_case 36,630 ns 38,000 ns +4%

@rust-log-analyzer

This comment has been minimized.

@Mark-Simulacrum

Copy link
Copy Markdown
Member

r=me with tidy fixed

@KowalskiThomas

Copy link
Copy Markdown
Contributor Author

Trying to fix the tidy job by adding "library/coretests/benches/pattern.rs" to typos.toml (which is what other files do for lorem ipsums)

rust-bors Bot pushed a commit that referenced this pull request Jun 8, 2026
…d-for-pattern, r=Mark-Simulacrum

perf: use `get_unchecked` for `TwoWaySearcher`



## What is this PR?

*This is related to #27721.*

This PR is a proposal for a performance improvement in `std::pattern`.  

Profiling of [https://github.com/quickwit-oss/quickwit](https://github.com/quickwit-oss/quickwit) in production shows that `TwoWaySearcher::next` is one of the most CPU-time-consuming functions, so I thought I would give it a look.  
I read the [contribution guide](https://std-dev-guide.rust-lang.org/development/perf-benchmarking.html) and this seems to be a fitting proposal.

It seems like `TwoWaySearcher::next` and `TwoWaySearcher::next_back` could be made faster by using `get_unchecked` in the inner loop comparisons instead of regular indexing, which is safe in the conditions where it would be done (indices are within bounds by construction).  
I added some `SAFETY` comments in the code to explain why this is safe, as I believe is customary in those cases (and according to [this page as well](https://std-dev-guide.rust-lang.org/policy/safety-comments.html)).

### Benchmarks

I ran the existing bencharmks before/after the changes (only on my laptop, I can run them in other places if that's necessary). 

```
./x.py bench library/coretests -- pattern::
```

We seem to be getting a ~7.5-12% performance improvement at a very low cost, which sounds worthwhile to me.  
But this is the first time I'm proposing a change in Rust, so I'm looking forward to feedback on this.

```
BEFORE CHANGES
    pattern::ends_with_char   3398.91ns/iter +/- 526.28
    pattern::ends_with_str    3545.04ns/iter +/- 1108.76
    pattern::starts_with_char 3348.31ns/iter +/- 352.38
    pattern::starts_with_str  3710.59ns/iter +/- 435.57

AFTER CHANGES
    pattern::ends_with_char   3125.99ns/iter +/- 567.09  (-8.03%)
    pattern::ends_with_str    3106.43ns/iter +/- 258.33  (-12.38%)
    pattern::starts_with_char 3094.55ns/iter +/- 595.42  (-7.59%)
    pattern::starts_with_str  3365.75ns/iter +/- 268.88  (-9.29%)
```

System info for the benchmarks run

<details>

```
Based on commit 8317fef

rustc 1.96.0-dev
binary: rustc
commit-hash: unknown
commit-date: unknown
host: aarch64-apple-darwin
release: 1.96.0-dev
LLVM version: 22.1.2

Apple M4 Max
16
64 GB
ProductName:		macOS
ProductVersion:		26.3
BuildVersion:		25D125
(this was run on AC and without any heavy load from other apps or whatnot)
```

</details>
@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job x86_64-gnu-tools failed! Check out the build log: (web) (plain enhanced) (plain)

Click to see the possible cause of the failure (guessed by this bot)
............................................       (144/144)

======== tests/rustdoc-gui/impl-block-doc.goml ========

[ERROR] impl-block-doc output:
Runtime.callFunctionOn timed out. Increase the 'protocolTimeout' setting in launch/connect calls for a higher timeout if needed.
stack: ProtocolError: Runtime.callFunctionOn timed out. Increase the 'protocolTimeout' setting in launch/connect calls for a higher timeout if needed.
    at <instance_members_initializer> (/checkout/obj/build/x86_64-unknown-linux-gnu/test/rustdoc-gui/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:103:14)
    at new Callback (/checkout/obj/build/x86_64-unknown-linux-gnu/test/rustdoc-gui/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:107:16)
    at CallbackRegistry.create (/checkout/obj/build/x86_64-unknown-linux-gnu/test/rustdoc-gui/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:25:26)
    at Connection._rawSend (/checkout/obj/build/x86_64-unknown-linux-gnu/test/rustdoc-gui/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:108:26)
    at CdpCDPSession.send (/checkout/obj/build/x86_64-unknown-linux-gnu/test/rustdoc-gui/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/CdpSession.js:74:33)
    at #evaluate (/checkout/obj/build/x86_64-unknown-linux-gnu/test/rustdoc-gui/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/ExecutionContext.js:363:50)
    at ExecutionContext.evaluate (/checkout/obj/build/x86_64-unknown-linux-gnu/test/rustdoc-gui/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/ExecutionContext.js:277:36)
    at IsolatedWorld.evaluate (/checkout/obj/build/x86_64-unknown-linux-gnu/test/rustdoc-gui/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/IsolatedWorld.js:100:30)
    at CdpFrame.evaluate (/checkout/obj/build/x86_64-unknown-linux-gnu/test/rustdoc-gui/node_modules/puppeteer-core/lib/cjs/puppeteer/api/Frame.js:362:43)
    at CdpFrame.<anonymous> (/checkout/obj/build/x86_64-unknown-linux-gnu/test/rustdoc-gui/node_modules/puppeteer-core/lib/cjs/puppeteer/util/decorators.js:109:27)



<= doc-ui tests done: 143 succeeded, 1 failed, 0 filtered out

@rust-bors rust-bors Bot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. labels Jun 8, 2026
@rust-bors

rust-bors Bot commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

💔 Test for f94864f failed: CI. Failed job:

@jieyouxu

jieyouxu commented Jun 8, 2026

Copy link
Copy Markdown
Member

Flaky rustdoc-gui test?
@bors retry

@rust-bors rust-bors Bot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 8, 2026
@rust-bors

This comment has been minimized.

@rust-bors

rust-bors Bot commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

☀️ Test successful - CI
Approved by: Mark-Simulacrum
Duration: 3h 32m 37s
Pushing 06293ff to main...

@rust-bors rust-bors Bot merged commit 06293ff into rust-lang:main Jun 8, 2026
14 checks passed
@rustbot rustbot added this to the 1.98.0 milestone Jun 8, 2026
@jieyouxu

jieyouxu commented Jun 8, 2026

Copy link
Copy Markdown
Member

@bors treeclosed-

@rust-bors

rust-bors Bot commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Tree is now open for merging.

@github-actions

github-actions Bot commented Jun 8, 2026

Copy link
Copy Markdown
Contributor
What is this? This is an experimental post-merge analysis report that shows differences in test outcomes between the merged PR and its parent PR.

Comparing 029c9e1 (parent) -> 06293ff (this PR)

Test differences

Show 8 test diffs

Stage 1

  • pattern::find_str: [missing] -> pass (J1)
  • pattern::find_str_worst_case: [missing] -> pass (J1)
  • pattern::rfind_str: [missing] -> pass (J1)
  • pattern::rfind_str_worst_case: [missing] -> pass (J1)

Stage 2

  • pattern::find_str: [missing] -> pass (J0)
  • pattern::find_str_worst_case: [missing] -> pass (J0)
  • pattern::rfind_str: [missing] -> pass (J0)
  • pattern::rfind_str_worst_case: [missing] -> pass (J0)

Job group index

Test dashboard

Run

cargo run --manifest-path src/ci/citool/Cargo.toml -- \
    test-dashboard 06293ff2b120aecfc29f84b90a22a743a5b90fef --output-dir test-dashboard

And then open test-dashboard/index.html in your browser to see an overview of all executed tests.

Job duration changes

  1. x86_64-gnu-gcc-core-tests: 15m 1s -> 8m 1s (-46.6%)
  2. dist-arm-linux-gnueabi: 1h 3m -> 1h 28m (+40.5%)
  3. x86_64-mingw-1: 2h 11m -> 2h 56m (+34.5%)
  4. pr-check-2: 45m 51s -> 31m 20s (-31.6%)
  5. dist-aarch64-apple: 1h 54m -> 1h 22m (-28.3%)
  6. x86_64-gnu-aux: 1h 54m -> 2h 21m (+24.0%)
  7. aarch64-apple: 2h 50m -> 3h 26m (+20.8%)
  8. dist-armv7-linux: 1h 32m -> 1h 13m (-20.6%)
  9. dist-x86_64-netbsd: 1h 27m -> 1h 10m (-20.0%)
  10. dist-ohos-aarch64: 1h 6m -> 1h 19m (+19.9%)
How to interpret the job duration changes?

Job durations can vary a lot, based on the actual runner instance
that executed the job, system noise, invalidated caches, etc. The table above is provided
mostly for t-infra members, for simpler debugging of potential CI slow-downs.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (06293ff): comparison URL.

Overall result: ❌✅ regressions and improvements - please read:

Our benchmarks found a performance regression caused by this PR.
This might be an actual regression, but it can also be just noise.

Next Steps:

  • If the regression was expected or you think it can be justified,
    please write a comment with sufficient written justification, and add
    @rustbot label: +perf-regression-triaged to it, to mark the regression as triaged.
  • If you think that you know of a way to resolve the regression, try to create
    a new PR with a fix for the regression.
  • If you do not understand the regression or you think that it is just noise,
    you can ask the @rust-lang/wg-compiler-performance working group for help (members of this group
    were already notified of this PR).

@rustbot label: +perf-regression
cc @rust-lang/wg-compiler-performance

Instruction count

Our most reliable metric. Used to determine the overall result above. However, even this metric can be noisy.

mean range count
Regressions ❌
(primary)
0.4% [0.2%, 0.7%] 4
Regressions ❌
(secondary)
0.4% [0.1%, 0.9%] 9
Improvements ✅
(primary)
-1.6% [-1.6%, -1.6%] 1
Improvements ✅
(secondary)
- - 0
All ❌✅ (primary) 0.0% [-1.6%, 0.7%] 5

Max RSS (memory usage)

Results (primary -2.9%)

A less reliable metric. May be of interest, but not used to determine the overall result above.

mean range count
Regressions ❌
(primary)
- - 0
Regressions ❌
(secondary)
- - 0
Improvements ✅
(primary)
-2.9% [-2.9%, -2.9%] 1
Improvements ✅
(secondary)
- - 0
All ❌✅ (primary) -2.9% [-2.9%, -2.9%] 1

Cycles

Results (secondary 3.4%)

A less reliable metric. May be of interest, but not used to determine the overall result above.

mean range count
Regressions ❌
(primary)
- - 0
Regressions ❌
(secondary)
3.4% [2.2%, 5.9%] 6
Improvements ✅
(primary)
- - 0
Improvements ✅
(secondary)
- - 0
All ❌✅ (primary) - - 0

Binary size

Results (primary -0.2%, secondary -0.1%)

A less reliable metric. May be of interest, but not used to determine the overall result above.

mean range count
Regressions ❌
(primary)
0.1% [0.1%, 0.1%] 4
Regressions ❌
(secondary)
0.1% [0.1%, 0.1%] 5
Improvements ✅
(primary)
-0.2% [-1.4%, -0.1%] 9
Improvements ✅
(secondary)
-0.1% [-0.1%, -0.1%] 35
All ❌✅ (primary) -0.2% [-1.4%, 0.1%] 13

Bootstrap: 517.684s -> 516.268s (-0.27%)
Artifact size: 400.80 MiB -> 400.81 MiB (0.00%)

@rustbot rustbot added the perf-regression Performance regression. label Jun 8, 2026
@Mark-Simulacrum Mark-Simulacrum added the perf-regression-triaged The performance regression has been triaged. label Jun 9, 2026
@Mark-Simulacrum

Copy link
Copy Markdown
Member

Pre-merge (with no changes) results were a slight improvement, and the regressions look like noise. Unclear what caused them but marking as triaged.

@KowalskiThomas KowalskiThomas deleted the kowalski/perf-use-get_unchecked-for-pattern branch June 9, 2026 07:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merged-by-bors This PR was explicitly merged by bors. perf-regression Performance regression. perf-regression-triaged The performance regression has been triaged. T-libs Relevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants