Change checkSourceLengthRule to use Span.IsWhiteSpace instead of Stri…#854
Merged
Conversation
ffdc59e to
7566598
Compare
…ng.Trim String.Trim can allocate a new string on each call, whereas Span.IsWhiteSpace() shouldn't allocate at all.
7566598 to
52c0007
Compare
Collaborator
|
@Numpsy argh, actually I realised that this PR makes allocations go down, but time go up? Do you mind changing it to use String.IsNullOrEmpty() instead? maybe it's the AsSpan() function that makes it a bit slower. |
Collaborator
Sorry, I meant String.IsNullOrWhiteSpace() |
knocte
added a commit
to knocte/FSharpLint
that referenced
this pull request
Jun 5, 2026
Recent PR[1] changed this hot-path from `Trim().Length<>0`` to `AsSpan().IsWhiteSpace()` and while the latter allocates less, it took actually longer to execute according to the contributor's own benchmark analysis. Using String.IsNullOrWhiteSpace seems better here, because it shouldn't allocate either (vs `Trim()`) while it avoids calling `AsSpan()`, and the poor-man measurement stick I have so far is GitHub's CI runs: 3 jobs with the old codebase were slower than 1 job with this change. [1] fsprojects#854
knocte
added a commit
to knocte/FSharpLint
that referenced
this pull request
Jun 5, 2026
Recent PR[1] changed this hot-path from `Trim().Length<>0` to `AsSpan().IsWhiteSpace()` and while the latter allocates less, it took actually longer to execute according to the contributor's own benchmark analysis. Using String.IsNullOrWhiteSpace seems better here, because it shouldn't allocate either (vs `Trim()`) while it avoids calling `AsSpan()`, and the poor-man measurement stick I have so far is GitHub's CI runs: 3 jobs with the old codebase were slower than 1 job with this change. [1] fsprojects#854
Collaborator
Tested it myself, and confirmed, it seems to be faster: #859 |
knocte
added a commit
that referenced
this pull request
Jun 5, 2026
Recent PR[1] changed this hot-path from `Trim().Length<>0` to `AsSpan().IsWhiteSpace()` and while the latter allocates less, it took actually longer to execute according to the contributor's own benchmark analysis. Using String.IsNullOrWhiteSpace seems better here, because it shouldn't allocate either (vs `Trim()`) while it avoids calling `AsSpan()`, and the poor-man measurement stick I have so far is GitHub's CI runs: 3 jobs with the old codebase were slower than 1 job with this change. [1] #854
Contributor
Author
|
I thought at the time that the timing changes were within the reported margin of error, though this is probably something that can be effected by .NET version or platform as well. |
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.
…ng.Trim
String.Trim can allocate a new string on each call, whereas Span.IsWhiteSpace() shouldn't allocate at all.
Just a thought when looking at some Span related things.
If I run the existing benchmark app using the rule set which is enabled during the SelfCheck part of the CI build then I get this with the current code
And this afterwards
A small change improvement given the total allocations, but also a small change so I thought it'd still be useful.