Skip to content

Change checkSourceLengthRule to use Span.IsWhiteSpace instead of Stri…#854

Merged
knocte merged 1 commit into
fsprojects:masterfrom
Numpsy:source_length_span
Jun 5, 2026
Merged

Change checkSourceLengthRule to use Span.IsWhiteSpace instead of Stri…#854
knocte merged 1 commit into
fsprojects:masterfrom
Numpsy:source_length_span

Conversation

@Numpsy
Copy link
Copy Markdown
Contributor

@Numpsy Numpsy commented May 3, 2026

…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

| Method         | Mean    | Error    | StdDev   | Gen0       | Gen1       | Gen2      | Allocated |
|--------------- |--------:|---------:|---------:|-----------:|-----------:|----------:|----------:|
| LintParsedFile | 1.442 s | 0.0155 s | 0.0145 s | 43000.0000 | 13000.0000 | 3000.0000 | 726.17 MB |

And this afterwards

| Method         | Mean    | Error    | StdDev   | Gen0       | Gen1       | Gen2      | Allocated |
|--------------- |--------:|---------:|---------:|-----------:|-----------:|----------:|----------:|
| LintParsedFile | 1.454 s | 0.0094 s | 0.0073 s | 42000.0000 | 13000.0000 | 3000.0000 | 722.76 MB |

A small change improvement given the total allocations, but also a small change so I thought it'd still be useful.

@knocte knocte force-pushed the source_length_span branch from ffdc59e to 7566598 Compare June 5, 2026 07:26
…ng.Trim

String.Trim can allocate a new string on each call, whereas Span.IsWhiteSpace() shouldn't allocate at all.
@knocte knocte force-pushed the source_length_span branch from 7566598 to 52c0007 Compare June 5, 2026 08:30
@knocte knocte merged commit 52ffd26 into fsprojects:master Jun 5, 2026
8 checks passed
@knocte
Copy link
Copy Markdown
Collaborator

knocte commented Jun 5, 2026

@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.

@knocte
Copy link
Copy Markdown
Collaborator

knocte commented Jun 5, 2026

Do you mind changing it to use String.IsNullOrEmpty() instead?

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
@knocte
Copy link
Copy Markdown
Collaborator

knocte commented Jun 5, 2026

Do you mind changing it to use String.IsNullOrWhiteSpace() instead? maybe it's the AsSpan() function that makes it a bit slower.

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
@Numpsy
Copy link
Copy Markdown
Contributor Author

Numpsy commented Jun 5, 2026

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants