Repository navigation
Use a linear-time substring search for in on str and bytes - #258
Open
Dilshad-Tanvi wants to merge 1 commit into
Open
Dilshad-Tanvi wants to merge 1 commit into
Dilshad-Tanvi wants to merge 1 commit into
Conversation
Contributor
|
@jtbraun has imported this pull request. If you are a Meta employee, you can view this in D127576443. (Because this pull request was imported automatically, there will not be any future comments.) |
8Keep
approved these changes
Oct 29, 2026
8Keep
left a comment
Contributor
There was a problem hiding this comment.
Review automatically exported from Phabricator review in Meta.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
x in sfor a str goes throughfast_string::contains, which for a needle longer than one byte checks the needle against every candidate position, andx in bfor bytes does the same withwindows(). The worst case is O(len(haystack) * len(needle)): a needle that matches the haystack except for its last byte makes every comparison run the whole needle. Starlark has no unbounded loops or recursion, so a short script like this is enough to tie up an evaluator:Release build, haystack 2n and needle n + 1:
Both now use
memchr::memmem::find, which is guaranteed linear in haystack plus needle.memchris already a workspace dependency used byfast_string. The str path had avoidedstr::containsbecause it is slow on short strings, andmemmem::findtakes a setup-free Rabin-Karp path for haystacks under 64 bytes, so the short case stays cheap. All other str searches (find, rfind, index, count, split, replace) already use std's linear searcher, so these two loops were the only quadratic ones.cargo test -p starlarkand-p starlark_syntaxpass, and the existingintests for str and bytes cover the semantics.