Streamline bool.TryParse/Format - #64782

Merged
stephentoub merged 2 commits into
dotnet:mainfrom
stephentoub:boolparseformat
Feb 7, 2022
Merged

Streamline bool.TryParse/Format#64782
stephentoub merged 2 commits into
dotnet:mainfrom
stephentoub:boolparseformat

Conversation

@stephentoub

@stephentoubstephentoub commented Feb 4, 2022

Copy link
Copy Markdown
Member
privatechar[]_true=newchar[]{'T','r','u','e'};privatechar[]_false=newchar[]{'F','a','l','s','e'};privatechar[]_somethingElse=newchar[]{'O','t','h','e','r'};[Benchmark]publicboolParseTrue()=>bool.TryParse(_true,out_);[Benchmark]publicboolParseFalse()=>bool.TryParse(_false,out_);[Benchmark]publicboolParseSomethingElse()=>bool.TryParse(_somethingElse,out_);[Benchmark]publicboolFormatTrue()=>true.TryFormat(_true,out_);[Benchmark]publicboolFormatFalse()=>false.TryFormat(_false,out_);
MethodToolchainMeanErrorStdDevRatio
ParseTrue\main\corerun.exe7.311 ns0.0171 ns0.0142 ns1.00
ParseTrue\pr\corerun.exe1.149 ns0.0243 ns0.0203 ns0.16
ParseFalse\main\corerun.exe8.749 ns0.0569 ns0.0504 ns1.00
ParseFalse\pr\corerun.exe2.309 ns0.0572 ns0.0477 ns0.26
ParseSomethingElse\main\corerun.exe17.638 ns0.1478 ns0.1382 ns1.00
ParseSomethingElse\pr\corerun.exe8.219 ns0.0511 ns0.0453 ns0.47
FormatTrue\main\corerun.exe3.117 ns0.0245 ns0.0204 ns1.00
FormatTrue\pr\corerun.exe2.000 ns0.0287 ns0.0269 ns0.64
FormatFalse\main\corerun.exe2.101 ns0.0363 ns0.0322 ns1.00
FormatFalse\pr\corerun.exe2.065 ns0.0416 ns0.0389 ns0.98

@ghost

ghost commented Feb 4, 2022

Copy link
Copy Markdown

I couldn't figure out the best area label to add to this PR. If you have write-permissions please help me learn by adding exactly one area label.

Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
@ghost

ghost commented Feb 4, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-runtime
See info in area-owners.md if you want to be subscribed.

Issue Details
privatechar[]_true=newchar[]{'T','r','u','e'};privatechar[]_false=newchar[]{'F','a','l','s','e'};privatechar[]_somethingElse=newchar[]{'O','t','h','e','r'};[Benchmark]publicboolParseTrue()=>bool.TryParse(_true,out_);[Benchmark]publicboolParseFalse()=>bool.TryParse(_false,out_);[Benchmark]publicboolParseSomethingElse()=>bool.TryParse(_somethingElse,out_);[Benchmark]publicboolFormatTrue()=>true.TryFormat(_true,out_);[Benchmark]publicboolFormatFalse()=>false.TryFormat(_false,out_);
MethodToolchainMeanErrorStdDevRatio
ParseTrue\main\corerun.exe7.311 ns0.0171 ns0.0142 ns1.00
ParseTrue\pr\corerun.exe1.149 ns0.0243 ns0.0203 ns0.16
ParseFalse\main\corerun.exe8.749 ns0.0569 ns0.0504 ns1.00
ParseFalse\pr\corerun.exe2.309 ns0.0572 ns0.0477 ns0.26
ParseSomethingElse\main\corerun.exe17.638 ns0.1478 ns0.1382 ns1.00
ParseSomethingElse\pr\corerun.exe8.219 ns0.0511 ns0.0453 ns0.47
FormatTrue\main\corerun.exe3.117 ns0.0245 ns0.0204 ns1.00
FormatTrue\pr\corerun.exe2.000 ns0.0287 ns0.0269 ns0.64
FormatFalse\main\corerun.exe2.101 ns0.0363 ns0.0322 ns1.00
FormatFalse\pr\corerun.exe2.065 ns0.0416 ns0.0389 ns0.98
Author:stephentoub
Assignees:stephentoub
Labels:

area-System.Runtime

Milestone:-

@danmoseley

Copy link
Copy Markdown
Contributor

Do you think that TrimWhiteSpaceAndNull can be improved also? It's on the "not a boolean" path.

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Do you think that TrimWhiteSpaceAndNull can be improved also?

I don't see anything about the implementation that can be meaningfully improved without restoring to unsafe code, at least not until the JIT recognizes some sort of backward iteration pattern for bounds-check elimination.

We can, however, push that whole trimming path off into a separate function, making it a bit cheaper to invoke the main parsing routine, along with being able to add a few more checks to more quickly weed out bad inputs.

MethodToolchainvalueMeanErrorRatio
TryParse\main\corerun.exeTrue18.4991 ns0.0338 ns1.00
TryParse\pr\corerun.exeTrue9.2014 ns0.0485 ns0.50
TryParse\main\corerun.exe015.6529 ns0.0662 ns1.00
TryParse\pr\corerun.exe01.2378 ns0.0064 ns0.08
TryParse\main\corerun.exeBogus17.7503 ns0.0832 ns1.00
TryParse\pr\corerun.exeBogus6.8170 ns0.0342 ns0.38
TryParse\main\corerun.exeFalse7.8471 ns0.0274 ns1.00
TryParse\pr\corerun.exeFalse1.4798 ns0.0066 ns0.19
TryParse\main\corerun.exeTRUE8.1593 ns0.0226 ns1.00
TryParse\pr\corerun.exeTRUE0.8097 ns0.0060 ns0.10
TryParse\main\corerun.exefalse7.9468 ns0.0555 ns1.00
TryParse\pr\corerun.exefalse1.4835 ns0.0090 ns0.19
TryParse\main\corerun.exetrue7.1882 ns0.0645 ns1.00
TryParse\pr\corerun.exetrue0.8110 ns0.0068 ns0.11

@danmoseley

Copy link
Copy Markdown
Contributor

Assuming that once we get to trimming the result will usually be a failure, I wonder whether IndexOfAny(char[] { 'e', 'E' } might allow bailing out quickly if the input is large.

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Assuming that once we get to trimming the result will usually be a failure, I wonder whether IndexOfAny(char[] { 'e', 'E' } might allow bailing out quickly if the input is large.

Have you seen any real-world cases of large inputs filled with whitespace and nulls being passed to bool.{Try}Parse?

@uweigand

Copy link
Copy Markdown
Contributor

This commit introduced serious regressions on s390x, about 40 library test cases now fail.

The problem seems to be that this (and similar lines):

BinaryPrimitives.WriteUInt64LittleEndian(MemoryMarshal.AsBytes(destination), 0x65007500720054); // "True"

is incorrect on big-endian systems. The destination memory will be set up as the following bytes:

 54 00 72 00 75 00 65 00

while on a big-endian system, the string should actually be:

 00 54 00 72 00 75 00 65

I'm currently testing a fix.

@uweigand

Copy link
Copy Markdown
Contributor

I'm currently testing a fix.

This is now #65078

@EgorBo

Copy link
Copy Markdown
Member

Improvements: dotnet/perf-autofiling-issues#3529

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Improvements

Always nice when what you saw locally is mirrored by the lab subsequently :)

@ghostghost locked as resolved and limited conversation to collaborators Mar 17, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@stephentoub@danmoseley@uweigand@EgorBo@jkotas@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Streamline bool.TryParse/Format - #64782

Merged
stephentoub merged 2 commits into
dotnet:mainfrom
stephentoub:boolparseformat
Feb 7, 2022
Merged

Streamline bool.TryParse/Format#64782
stephentoub merged 2 commits into
dotnet:mainfrom
stephentoub:boolparseformat

Conversation

@stephentoub

@stephentoubstephentoub commented Feb 4, 2022

Copy link
Copy Markdown
Member
privatechar[]_true=newchar[]{'T','r','u','e'};privatechar[]_false=newchar[]{'F','a','l','s','e'};privatechar[]_somethingElse=newchar[]{'O','t','h','e','r'};[Benchmark]publicboolParseTrue()=>bool.TryParse(_true,out_);[Benchmark]publicboolParseFalse()=>bool.TryParse(_false,out_);[Benchmark]publicboolParseSomethingElse()=>bool.TryParse(_somethingElse,out_);[Benchmark]publicboolFormatTrue()=>true.TryFormat(_true,out_);[Benchmark]publicboolFormatFalse()=>false.TryFormat(_false,out_);
MethodToolchainMeanErrorStdDevRatio
ParseTrue\main\corerun.exe7.311 ns0.0171 ns0.0142 ns1.00
ParseTrue\pr\corerun.exe1.149 ns0.0243 ns0.0203 ns0.16
ParseFalse\main\corerun.exe8.749 ns0.0569 ns0.0504 ns1.00
ParseFalse\pr\corerun.exe2.309 ns0.0572 ns0.0477 ns0.26
ParseSomethingElse\main\corerun.exe17.638 ns0.1478 ns0.1382 ns1.00
ParseSomethingElse\pr\corerun.exe8.219 ns0.0511 ns0.0453 ns0.47
FormatTrue\main\corerun.exe3.117 ns0.0245 ns0.0204 ns1.00
FormatTrue\pr\corerun.exe2.000 ns0.0287 ns0.0269 ns0.64
FormatFalse\main\corerun.exe2.101 ns0.0363 ns0.0322 ns1.00
FormatFalse\pr\corerun.exe2.065 ns0.0416 ns0.0389 ns0.98

@ghost

ghost commented Feb 4, 2022

Copy link
Copy Markdown

I couldn't figure out the best area label to add to this PR. If you have write-permissions please help me learn by adding exactly one area label.

Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
@ghost

ghost commented Feb 4, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-runtime
See info in area-owners.md if you want to be subscribed.

Issue Details
privatechar[]_true=newchar[]{'T','r','u','e'};privatechar[]_false=newchar[]{'F','a','l','s','e'};privatechar[]_somethingElse=newchar[]{'O','t','h','e','r'};[Benchmark]publicboolParseTrue()=>bool.TryParse(_true,out_);[Benchmark]publicboolParseFalse()=>bool.TryParse(_false,out_);[Benchmark]publicboolParseSomethingElse()=>bool.TryParse(_somethingElse,out_);[Benchmark]publicboolFormatTrue()=>true.TryFormat(_true,out_);[Benchmark]publicboolFormatFalse()=>false.TryFormat(_false,out_);
MethodToolchainMeanErrorStdDevRatio
ParseTrue\main\corerun.exe7.311 ns0.0171 ns0.0142 ns1.00
ParseTrue\pr\corerun.exe1.149 ns0.0243 ns0.0203 ns0.16
ParseFalse\main\corerun.exe8.749 ns0.0569 ns0.0504 ns1.00
ParseFalse\pr\corerun.exe2.309 ns0.0572 ns0.0477 ns0.26
ParseSomethingElse\main\corerun.exe17.638 ns0.1478 ns0.1382 ns1.00
ParseSomethingElse\pr\corerun.exe8.219 ns0.0511 ns0.0453 ns0.47
FormatTrue\main\corerun.exe3.117 ns0.0245 ns0.0204 ns1.00
FormatTrue\pr\corerun.exe2.000 ns0.0287 ns0.0269 ns0.64
FormatFalse\main\corerun.exe2.101 ns0.0363 ns0.0322 ns1.00
FormatFalse\pr\corerun.exe2.065 ns0.0416 ns0.0389 ns0.98
Author:stephentoub
Assignees:stephentoub
Labels:

area-System.Runtime

Milestone:-

@danmoseley

Copy link
Copy Markdown
Contributor

Do you think that TrimWhiteSpaceAndNull can be improved also? It's on the "not a boolean" path.

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Do you think that TrimWhiteSpaceAndNull can be improved also?

I don't see anything about the implementation that can be meaningfully improved without restoring to unsafe code, at least not until the JIT recognizes some sort of backward iteration pattern for bounds-check elimination.

We can, however, push that whole trimming path off into a separate function, making it a bit cheaper to invoke the main parsing routine, along with being able to add a few more checks to more quickly weed out bad inputs.

MethodToolchainvalueMeanErrorRatio
TryParse\main\corerun.exeTrue18.4991 ns0.0338 ns1.00
TryParse\pr\corerun.exeTrue9.2014 ns0.0485 ns0.50
TryParse\main\corerun.exe015.6529 ns0.0662 ns1.00
TryParse\pr\corerun.exe01.2378 ns0.0064 ns0.08
TryParse\main\corerun.exeBogus17.7503 ns0.0832 ns1.00
TryParse\pr\corerun.exeBogus6.8170 ns0.0342 ns0.38
TryParse\main\corerun.exeFalse7.8471 ns0.0274 ns1.00
TryParse\pr\corerun.exeFalse1.4798 ns0.0066 ns0.19
TryParse\main\corerun.exeTRUE8.1593 ns0.0226 ns1.00
TryParse\pr\corerun.exeTRUE0.8097 ns0.0060 ns0.10
TryParse\main\corerun.exefalse7.9468 ns0.0555 ns1.00
TryParse\pr\corerun.exefalse1.4835 ns0.0090 ns0.19
TryParse\main\corerun.exetrue7.1882 ns0.0645 ns1.00
TryParse\pr\corerun.exetrue0.8110 ns0.0068 ns0.11

@danmoseley

Copy link
Copy Markdown
Contributor

Assuming that once we get to trimming the result will usually be a failure, I wonder whether IndexOfAny(char[] { 'e', 'E' } might allow bailing out quickly if the input is large.

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Assuming that once we get to trimming the result will usually be a failure, I wonder whether IndexOfAny(char[] { 'e', 'E' } might allow bailing out quickly if the input is large.

Have you seen any real-world cases of large inputs filled with whitespace and nulls being passed to bool.{Try}Parse?

@uweigand

Copy link
Copy Markdown
Contributor

This commit introduced serious regressions on s390x, about 40 library test cases now fail.

The problem seems to be that this (and similar lines):

BinaryPrimitives.WriteUInt64LittleEndian(MemoryMarshal.AsBytes(destination), 0x65007500720054); // "True"

is incorrect on big-endian systems. The destination memory will be set up as the following bytes:

 54 00 72 00 75 00 65 00

while on a big-endian system, the string should actually be:

 00 54 00 72 00 75 00 65

I'm currently testing a fix.

@uweigand

Copy link
Copy Markdown
Contributor

I'm currently testing a fix.

This is now #65078

@EgorBo

Copy link
Copy Markdown
Member

Improvements: dotnet/perf-autofiling-issues#3529

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Improvements

Always nice when what you saw locally is mirrored by the lab subsequently :)

@ghostghost locked as resolved and limited conversation to collaborators Mar 17, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@stephentoub@danmoseley@uweigand@EgorBo@jkotas@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Streamline bool.TryParse/Format - #64782

Merged
stephentoub merged 2 commits into
dotnet:mainfrom
stephentoub:boolparseformat
Feb 7, 2022
Merged

Streamline bool.TryParse/Format#64782
stephentoub merged 2 commits into
dotnet:mainfrom
stephentoub:boolparseformat

Conversation

@stephentoub

@stephentoubstephentoub commented Feb 4, 2022

Copy link
Copy Markdown
Member
privatechar[]_true=newchar[]{'T','r','u','e'};privatechar[]_false=newchar[]{'F','a','l','s','e'};privatechar[]_somethingElse=newchar[]{'O','t','h','e','r'};[Benchmark]publicboolParseTrue()=>bool.TryParse(_true,out_);[Benchmark]publicboolParseFalse()=>bool.TryParse(_false,out_);[Benchmark]publicboolParseSomethingElse()=>bool.TryParse(_somethingElse,out_);[Benchmark]publicboolFormatTrue()=>true.TryFormat(_true,out_);[Benchmark]publicboolFormatFalse()=>false.TryFormat(_false,out_);
MethodToolchainMeanErrorStdDevRatio
ParseTrue\main\corerun.exe7.311 ns0.0171 ns0.0142 ns1.00
ParseTrue\pr\corerun.exe1.149 ns0.0243 ns0.0203 ns0.16
ParseFalse\main\corerun.exe8.749 ns0.0569 ns0.0504 ns1.00
ParseFalse\pr\corerun.exe2.309 ns0.0572 ns0.0477 ns0.26
ParseSomethingElse\main\corerun.exe17.638 ns0.1478 ns0.1382 ns1.00
ParseSomethingElse\pr\corerun.exe8.219 ns0.0511 ns0.0453 ns0.47
FormatTrue\main\corerun.exe3.117 ns0.0245 ns0.0204 ns1.00
FormatTrue\pr\corerun.exe2.000 ns0.0287 ns0.0269 ns0.64
FormatFalse\main\corerun.exe2.101 ns0.0363 ns0.0322 ns1.00
FormatFalse\pr\corerun.exe2.065 ns0.0416 ns0.0389 ns0.98

@ghost

ghost commented Feb 4, 2022

Copy link
Copy Markdown

I couldn't figure out the best area label to add to this PR. If you have write-permissions please help me learn by adding exactly one area label.

Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
@ghost

ghost commented Feb 4, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-runtime
See info in area-owners.md if you want to be subscribed.

Issue Details
privatechar[]_true=newchar[]{'T','r','u','e'};privatechar[]_false=newchar[]{'F','a','l','s','e'};privatechar[]_somethingElse=newchar[]{'O','t','h','e','r'};[Benchmark]publicboolParseTrue()=>bool.TryParse(_true,out_);[Benchmark]publicboolParseFalse()=>bool.TryParse(_false,out_);[Benchmark]publicboolParseSomethingElse()=>bool.TryParse(_somethingElse,out_);[Benchmark]publicboolFormatTrue()=>true.TryFormat(_true,out_);[Benchmark]publicboolFormatFalse()=>false.TryFormat(_false,out_);
MethodToolchainMeanErrorStdDevRatio
ParseTrue\main\corerun.exe7.311 ns0.0171 ns0.0142 ns1.00
ParseTrue\pr\corerun.exe1.149 ns0.0243 ns0.0203 ns0.16
ParseFalse\main\corerun.exe8.749 ns0.0569 ns0.0504 ns1.00
ParseFalse\pr\corerun.exe2.309 ns0.0572 ns0.0477 ns0.26
ParseSomethingElse\main\corerun.exe17.638 ns0.1478 ns0.1382 ns1.00
ParseSomethingElse\pr\corerun.exe8.219 ns0.0511 ns0.0453 ns0.47
FormatTrue\main\corerun.exe3.117 ns0.0245 ns0.0204 ns1.00
FormatTrue\pr\corerun.exe2.000 ns0.0287 ns0.0269 ns0.64
FormatFalse\main\corerun.exe2.101 ns0.0363 ns0.0322 ns1.00
FormatFalse\pr\corerun.exe2.065 ns0.0416 ns0.0389 ns0.98
Author:stephentoub
Assignees:stephentoub
Labels:

area-System.Runtime

Milestone:-

@danmoseley

Copy link
Copy Markdown
Contributor

Do you think that TrimWhiteSpaceAndNull can be improved also? It's on the "not a boolean" path.

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Do you think that TrimWhiteSpaceAndNull can be improved also?

I don't see anything about the implementation that can be meaningfully improved without restoring to unsafe code, at least not until the JIT recognizes some sort of backward iteration pattern for bounds-check elimination.

We can, however, push that whole trimming path off into a separate function, making it a bit cheaper to invoke the main parsing routine, along with being able to add a few more checks to more quickly weed out bad inputs.

MethodToolchainvalueMeanErrorRatio
TryParse\main\corerun.exeTrue18.4991 ns0.0338 ns1.00
TryParse\pr\corerun.exeTrue9.2014 ns0.0485 ns0.50
TryParse\main\corerun.exe015.6529 ns0.0662 ns1.00
TryParse\pr\corerun.exe01.2378 ns0.0064 ns0.08
TryParse\main\corerun.exeBogus17.7503 ns0.0832 ns1.00
TryParse\pr\corerun.exeBogus6.8170 ns0.0342 ns0.38
TryParse\main\corerun.exeFalse7.8471 ns0.0274 ns1.00
TryParse\pr\corerun.exeFalse1.4798 ns0.0066 ns0.19
TryParse\main\corerun.exeTRUE8.1593 ns0.0226 ns1.00
TryParse\pr\corerun.exeTRUE0.8097 ns0.0060 ns0.10
TryParse\main\corerun.exefalse7.9468 ns0.0555 ns1.00
TryParse\pr\corerun.exefalse1.4835 ns0.0090 ns0.19
TryParse\main\corerun.exetrue7.1882 ns0.0645 ns1.00
TryParse\pr\corerun.exetrue0.8110 ns0.0068 ns0.11

@danmoseley

Copy link
Copy Markdown
Contributor

Assuming that once we get to trimming the result will usually be a failure, I wonder whether IndexOfAny(char[] { 'e', 'E' } might allow bailing out quickly if the input is large.

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Assuming that once we get to trimming the result will usually be a failure, I wonder whether IndexOfAny(char[] { 'e', 'E' } might allow bailing out quickly if the input is large.

Have you seen any real-world cases of large inputs filled with whitespace and nulls being passed to bool.{Try}Parse?

@uweigand

Copy link
Copy Markdown
Contributor

This commit introduced serious regressions on s390x, about 40 library test cases now fail.

The problem seems to be that this (and similar lines):

BinaryPrimitives.WriteUInt64LittleEndian(MemoryMarshal.AsBytes(destination), 0x65007500720054); // "True"

is incorrect on big-endian systems. The destination memory will be set up as the following bytes:

 54 00 72 00 75 00 65 00

while on a big-endian system, the string should actually be:

 00 54 00 72 00 75 00 65

I'm currently testing a fix.

@uweigand

Copy link
Copy Markdown
Contributor

I'm currently testing a fix.

This is now #65078

@EgorBo

Copy link
Copy Markdown
Member

Improvements: dotnet/perf-autofiling-issues#3529

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Improvements

Always nice when what you saw locally is mirrored by the lab subsequently :)

@ghostghost locked as resolved and limited conversation to collaborators Mar 17, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@stephentoub@danmoseley@uweigand@EgorBo@jkotas@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Streamline bool.TryParse/Format - #64782

Merged
stephentoub merged 2 commits into
dotnet:mainfrom
stephentoub:boolparseformat
Feb 7, 2022
Merged

Streamline bool.TryParse/Format#64782
stephentoub merged 2 commits into
dotnet:mainfrom
stephentoub:boolparseformat

Conversation

@stephentoub

@stephentoubstephentoub commented Feb 4, 2022

Copy link
Copy Markdown
Member
privatechar[]_true=newchar[]{'T','r','u','e'};privatechar[]_false=newchar[]{'F','a','l','s','e'};privatechar[]_somethingElse=newchar[]{'O','t','h','e','r'};[Benchmark]publicboolParseTrue()=>bool.TryParse(_true,out_);[Benchmark]publicboolParseFalse()=>bool.TryParse(_false,out_);[Benchmark]publicboolParseSomethingElse()=>bool.TryParse(_somethingElse,out_);[Benchmark]publicboolFormatTrue()=>true.TryFormat(_true,out_);[Benchmark]publicboolFormatFalse()=>false.TryFormat(_false,out_);
MethodToolchainMeanErrorStdDevRatio
ParseTrue\main\corerun.exe7.311 ns0.0171 ns0.0142 ns1.00
ParseTrue\pr\corerun.exe1.149 ns0.0243 ns0.0203 ns0.16
ParseFalse\main\corerun.exe8.749 ns0.0569 ns0.0504 ns1.00
ParseFalse\pr\corerun.exe2.309 ns0.0572 ns0.0477 ns0.26
ParseSomethingElse\main\corerun.exe17.638 ns0.1478 ns0.1382 ns1.00
ParseSomethingElse\pr\corerun.exe8.219 ns0.0511 ns0.0453 ns0.47
FormatTrue\main\corerun.exe3.117 ns0.0245 ns0.0204 ns1.00
FormatTrue\pr\corerun.exe2.000 ns0.0287 ns0.0269 ns0.64
FormatFalse\main\corerun.exe2.101 ns0.0363 ns0.0322 ns1.00
FormatFalse\pr\corerun.exe2.065 ns0.0416 ns0.0389 ns0.98

@ghost

ghost commented Feb 4, 2022

Copy link
Copy Markdown

I couldn't figure out the best area label to add to this PR. If you have write-permissions please help me learn by adding exactly one area label.

Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
@ghost

ghost commented Feb 4, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-runtime
See info in area-owners.md if you want to be subscribed.

Issue Details
privatechar[]_true=newchar[]{'T','r','u','e'};privatechar[]_false=newchar[]{'F','a','l','s','e'};privatechar[]_somethingElse=newchar[]{'O','t','h','e','r'};[Benchmark]publicboolParseTrue()=>bool.TryParse(_true,out_);[Benchmark]publicboolParseFalse()=>bool.TryParse(_false,out_);[Benchmark]publicboolParseSomethingElse()=>bool.TryParse(_somethingElse,out_);[Benchmark]publicboolFormatTrue()=>true.TryFormat(_true,out_);[Benchmark]publicboolFormatFalse()=>false.TryFormat(_false,out_);
MethodToolchainMeanErrorStdDevRatio
ParseTrue\main\corerun.exe7.311 ns0.0171 ns0.0142 ns1.00
ParseTrue\pr\corerun.exe1.149 ns0.0243 ns0.0203 ns0.16
ParseFalse\main\corerun.exe8.749 ns0.0569 ns0.0504 ns1.00
ParseFalse\pr\corerun.exe2.309 ns0.0572 ns0.0477 ns0.26
ParseSomethingElse\main\corerun.exe17.638 ns0.1478 ns0.1382 ns1.00
ParseSomethingElse\pr\corerun.exe8.219 ns0.0511 ns0.0453 ns0.47
FormatTrue\main\corerun.exe3.117 ns0.0245 ns0.0204 ns1.00
FormatTrue\pr\corerun.exe2.000 ns0.0287 ns0.0269 ns0.64
FormatFalse\main\corerun.exe2.101 ns0.0363 ns0.0322 ns1.00
FormatFalse\pr\corerun.exe2.065 ns0.0416 ns0.0389 ns0.98
Author:stephentoub
Assignees:stephentoub
Labels:

area-System.Runtime

Milestone:-

@danmoseley

Copy link
Copy Markdown
Contributor

Do you think that TrimWhiteSpaceAndNull can be improved also? It's on the "not a boolean" path.

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Do you think that TrimWhiteSpaceAndNull can be improved also?

I don't see anything about the implementation that can be meaningfully improved without restoring to unsafe code, at least not until the JIT recognizes some sort of backward iteration pattern for bounds-check elimination.

We can, however, push that whole trimming path off into a separate function, making it a bit cheaper to invoke the main parsing routine, along with being able to add a few more checks to more quickly weed out bad inputs.

MethodToolchainvalueMeanErrorRatio
TryParse\main\corerun.exeTrue18.4991 ns0.0338 ns1.00
TryParse\pr\corerun.exeTrue9.2014 ns0.0485 ns0.50
TryParse\main\corerun.exe015.6529 ns0.0662 ns1.00
TryParse\pr\corerun.exe01.2378 ns0.0064 ns0.08
TryParse\main\corerun.exeBogus17.7503 ns0.0832 ns1.00
TryParse\pr\corerun.exeBogus6.8170 ns0.0342 ns0.38
TryParse\main\corerun.exeFalse7.8471 ns0.0274 ns1.00
TryParse\pr\corerun.exeFalse1.4798 ns0.0066 ns0.19
TryParse\main\corerun.exeTRUE8.1593 ns0.0226 ns1.00
TryParse\pr\corerun.exeTRUE0.8097 ns0.0060 ns0.10
TryParse\main\corerun.exefalse7.9468 ns0.0555 ns1.00
TryParse\pr\corerun.exefalse1.4835 ns0.0090 ns0.19
TryParse\main\corerun.exetrue7.1882 ns0.0645 ns1.00
TryParse\pr\corerun.exetrue0.8110 ns0.0068 ns0.11

@danmoseley

Copy link
Copy Markdown
Contributor

Assuming that once we get to trimming the result will usually be a failure, I wonder whether IndexOfAny(char[] { 'e', 'E' } might allow bailing out quickly if the input is large.

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Assuming that once we get to trimming the result will usually be a failure, I wonder whether IndexOfAny(char[] { 'e', 'E' } might allow bailing out quickly if the input is large.

Have you seen any real-world cases of large inputs filled with whitespace and nulls being passed to bool.{Try}Parse?

@uweigand

Copy link
Copy Markdown
Contributor

This commit introduced serious regressions on s390x, about 40 library test cases now fail.

The problem seems to be that this (and similar lines):

BinaryPrimitives.WriteUInt64LittleEndian(MemoryMarshal.AsBytes(destination), 0x65007500720054); // "True"

is incorrect on big-endian systems. The destination memory will be set up as the following bytes:

 54 00 72 00 75 00 65 00

while on a big-endian system, the string should actually be:

 00 54 00 72 00 75 00 65

I'm currently testing a fix.

@uweigand

Copy link
Copy Markdown
Contributor

I'm currently testing a fix.

This is now #65078

@EgorBo

Copy link
Copy Markdown
Member

Improvements: dotnet/perf-autofiling-issues#3529

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Improvements

Always nice when what you saw locally is mirrored by the lab subsequently :)

@ghostghost locked as resolved and limited conversation to collaborators Mar 17, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@stephentoub@danmoseley@uweigand@EgorBo@jkotas@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Streamline bool.TryParse/Format - #64782

Merged
stephentoub merged 2 commits into
dotnet:mainfrom
stephentoub:boolparseformat
Feb 7, 2022
Merged

Streamline bool.TryParse/Format#64782
stephentoub merged 2 commits into
dotnet:mainfrom
stephentoub:boolparseformat

Conversation

@stephentoub

@stephentoubstephentoub commented Feb 4, 2022

Copy link
Copy Markdown
Member
privatechar[]_true=newchar[]{'T','r','u','e'};privatechar[]_false=newchar[]{'F','a','l','s','e'};privatechar[]_somethingElse=newchar[]{'O','t','h','e','r'};[Benchmark]publicboolParseTrue()=>bool.TryParse(_true,out_);[Benchmark]publicboolParseFalse()=>bool.TryParse(_false,out_);[Benchmark]publicboolParseSomethingElse()=>bool.TryParse(_somethingElse,out_);[Benchmark]publicboolFormatTrue()=>true.TryFormat(_true,out_);[Benchmark]publicboolFormatFalse()=>false.TryFormat(_false,out_);
MethodToolchainMeanErrorStdDevRatio
ParseTrue\main\corerun.exe7.311 ns0.0171 ns0.0142 ns1.00
ParseTrue\pr\corerun.exe1.149 ns0.0243 ns0.0203 ns0.16
ParseFalse\main\corerun.exe8.749 ns0.0569 ns0.0504 ns1.00
ParseFalse\pr\corerun.exe2.309 ns0.0572 ns0.0477 ns0.26
ParseSomethingElse\main\corerun.exe17.638 ns0.1478 ns0.1382 ns1.00
ParseSomethingElse\pr\corerun.exe8.219 ns0.0511 ns0.0453 ns0.47
FormatTrue\main\corerun.exe3.117 ns0.0245 ns0.0204 ns1.00
FormatTrue\pr\corerun.exe2.000 ns0.0287 ns0.0269 ns0.64
FormatFalse\main\corerun.exe2.101 ns0.0363 ns0.0322 ns1.00
FormatFalse\pr\corerun.exe2.065 ns0.0416 ns0.0389 ns0.98

@ghost

ghost commented Feb 4, 2022

Copy link
Copy Markdown

I couldn't figure out the best area label to add to this PR. If you have write-permissions please help me learn by adding exactly one area label.

Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
@ghost

ghost commented Feb 4, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-runtime
See info in area-owners.md if you want to be subscribed.

Issue Details
privatechar[]_true=newchar[]{'T','r','u','e'};privatechar[]_false=newchar[]{'F','a','l','s','e'};privatechar[]_somethingElse=newchar[]{'O','t','h','e','r'};[Benchmark]publicboolParseTrue()=>bool.TryParse(_true,out_);[Benchmark]publicboolParseFalse()=>bool.TryParse(_false,out_);[Benchmark]publicboolParseSomethingElse()=>bool.TryParse(_somethingElse,out_);[Benchmark]publicboolFormatTrue()=>true.TryFormat(_true,out_);[Benchmark]publicboolFormatFalse()=>false.TryFormat(_false,out_);
MethodToolchainMeanErrorStdDevRatio
ParseTrue\main\corerun.exe7.311 ns0.0171 ns0.0142 ns1.00
ParseTrue\pr\corerun.exe1.149 ns0.0243 ns0.0203 ns0.16
ParseFalse\main\corerun.exe8.749 ns0.0569 ns0.0504 ns1.00
ParseFalse\pr\corerun.exe2.309 ns0.0572 ns0.0477 ns0.26
ParseSomethingElse\main\corerun.exe17.638 ns0.1478 ns0.1382 ns1.00
ParseSomethingElse\pr\corerun.exe8.219 ns0.0511 ns0.0453 ns0.47
FormatTrue\main\corerun.exe3.117 ns0.0245 ns0.0204 ns1.00
FormatTrue\pr\corerun.exe2.000 ns0.0287 ns0.0269 ns0.64
FormatFalse\main\corerun.exe2.101 ns0.0363 ns0.0322 ns1.00
FormatFalse\pr\corerun.exe2.065 ns0.0416 ns0.0389 ns0.98
Author:stephentoub
Assignees:stephentoub
Labels:

area-System.Runtime

Milestone:-

@danmoseley

Copy link
Copy Markdown
Contributor

Do you think that TrimWhiteSpaceAndNull can be improved also? It's on the "not a boolean" path.

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Do you think that TrimWhiteSpaceAndNull can be improved also?

I don't see anything about the implementation that can be meaningfully improved without restoring to unsafe code, at least not until the JIT recognizes some sort of backward iteration pattern for bounds-check elimination.

We can, however, push that whole trimming path off into a separate function, making it a bit cheaper to invoke the main parsing routine, along with being able to add a few more checks to more quickly weed out bad inputs.

MethodToolchainvalueMeanErrorRatio
TryParse\main\corerun.exeTrue18.4991 ns0.0338 ns1.00
TryParse\pr\corerun.exeTrue9.2014 ns0.0485 ns0.50
TryParse\main\corerun.exe015.6529 ns0.0662 ns1.00
TryParse\pr\corerun.exe01.2378 ns0.0064 ns0.08
TryParse\main\corerun.exeBogus17.7503 ns0.0832 ns1.00
TryParse\pr\corerun.exeBogus6.8170 ns0.0342 ns0.38
TryParse\main\corerun.exeFalse7.8471 ns0.0274 ns1.00
TryParse\pr\corerun.exeFalse1.4798 ns0.0066 ns0.19
TryParse\main\corerun.exeTRUE8.1593 ns0.0226 ns1.00
TryParse\pr\corerun.exeTRUE0.8097 ns0.0060 ns0.10
TryParse\main\corerun.exefalse7.9468 ns0.0555 ns1.00
TryParse\pr\corerun.exefalse1.4835 ns0.0090 ns0.19
TryParse\main\corerun.exetrue7.1882 ns0.0645 ns1.00
TryParse\pr\corerun.exetrue0.8110 ns0.0068 ns0.11

@danmoseley

Copy link
Copy Markdown
Contributor

Assuming that once we get to trimming the result will usually be a failure, I wonder whether IndexOfAny(char[] { 'e', 'E' } might allow bailing out quickly if the input is large.

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Assuming that once we get to trimming the result will usually be a failure, I wonder whether IndexOfAny(char[] { 'e', 'E' } might allow bailing out quickly if the input is large.

Have you seen any real-world cases of large inputs filled with whitespace and nulls being passed to bool.{Try}Parse?

@uweigand

Copy link
Copy Markdown
Contributor

This commit introduced serious regressions on s390x, about 40 library test cases now fail.

The problem seems to be that this (and similar lines):

BinaryPrimitives.WriteUInt64LittleEndian(MemoryMarshal.AsBytes(destination), 0x65007500720054); // "True"

is incorrect on big-endian systems. The destination memory will be set up as the following bytes:

 54 00 72 00 75 00 65 00

while on a big-endian system, the string should actually be:

 00 54 00 72 00 75 00 65

I'm currently testing a fix.

@uweigand

Copy link
Copy Markdown
Contributor

I'm currently testing a fix.

This is now #65078

@EgorBo

Copy link
Copy Markdown
Member

Improvements: dotnet/perf-autofiling-issues#3529

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Improvements

Always nice when what you saw locally is mirrored by the lab subsequently :)

@ghostghost locked as resolved and limited conversation to collaborators Mar 17, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@stephentoub@danmoseley@uweigand@EgorBo@jkotas@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Streamline bool.TryParse/Format - #64782

Merged
stephentoub merged 2 commits into
dotnet:mainfrom
stephentoub:boolparseformat
Feb 7, 2022
Merged

Streamline bool.TryParse/Format#64782
stephentoub merged 2 commits into
dotnet:mainfrom
stephentoub:boolparseformat

Conversation

@stephentoub

@stephentoubstephentoub commented Feb 4, 2022

Copy link
Copy Markdown
Member
privatechar[]_true=newchar[]{'T','r','u','e'};privatechar[]_false=newchar[]{'F','a','l','s','e'};privatechar[]_somethingElse=newchar[]{'O','t','h','e','r'};[Benchmark]publicboolParseTrue()=>bool.TryParse(_true,out_);[Benchmark]publicboolParseFalse()=>bool.TryParse(_false,out_);[Benchmark]publicboolParseSomethingElse()=>bool.TryParse(_somethingElse,out_);[Benchmark]publicboolFormatTrue()=>true.TryFormat(_true,out_);[Benchmark]publicboolFormatFalse()=>false.TryFormat(_false,out_);
MethodToolchainMeanErrorStdDevRatio
ParseTrue\main\corerun.exe7.311 ns0.0171 ns0.0142 ns1.00
ParseTrue\pr\corerun.exe1.149 ns0.0243 ns0.0203 ns0.16
ParseFalse\main\corerun.exe8.749 ns0.0569 ns0.0504 ns1.00
ParseFalse\pr\corerun.exe2.309 ns0.0572 ns0.0477 ns0.26
ParseSomethingElse\main\corerun.exe17.638 ns0.1478 ns0.1382 ns1.00
ParseSomethingElse\pr\corerun.exe8.219 ns0.0511 ns0.0453 ns0.47
FormatTrue\main\corerun.exe3.117 ns0.0245 ns0.0204 ns1.00
FormatTrue\pr\corerun.exe2.000 ns0.0287 ns0.0269 ns0.64
FormatFalse\main\corerun.exe2.101 ns0.0363 ns0.0322 ns1.00
FormatFalse\pr\corerun.exe2.065 ns0.0416 ns0.0389 ns0.98

@ghost

ghost commented Feb 4, 2022

Copy link
Copy Markdown

I couldn't figure out the best area label to add to this PR. If you have write-permissions please help me learn by adding exactly one area label.

Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
@ghost

ghost commented Feb 4, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-runtime
See info in area-owners.md if you want to be subscribed.

Issue Details
privatechar[]_true=newchar[]{'T','r','u','e'};privatechar[]_false=newchar[]{'F','a','l','s','e'};privatechar[]_somethingElse=newchar[]{'O','t','h','e','r'};[Benchmark]publicboolParseTrue()=>bool.TryParse(_true,out_);[Benchmark]publicboolParseFalse()=>bool.TryParse(_false,out_);[Benchmark]publicboolParseSomethingElse()=>bool.TryParse(_somethingElse,out_);[Benchmark]publicboolFormatTrue()=>true.TryFormat(_true,out_);[Benchmark]publicboolFormatFalse()=>false.TryFormat(_false,out_);
MethodToolchainMeanErrorStdDevRatio
ParseTrue\main\corerun.exe7.311 ns0.0171 ns0.0142 ns1.00
ParseTrue\pr\corerun.exe1.149 ns0.0243 ns0.0203 ns0.16
ParseFalse\main\corerun.exe8.749 ns0.0569 ns0.0504 ns1.00
ParseFalse\pr\corerun.exe2.309 ns0.0572 ns0.0477 ns0.26
ParseSomethingElse\main\corerun.exe17.638 ns0.1478 ns0.1382 ns1.00
ParseSomethingElse\pr\corerun.exe8.219 ns0.0511 ns0.0453 ns0.47
FormatTrue\main\corerun.exe3.117 ns0.0245 ns0.0204 ns1.00
FormatTrue\pr\corerun.exe2.000 ns0.0287 ns0.0269 ns0.64
FormatFalse\main\corerun.exe2.101 ns0.0363 ns0.0322 ns1.00
FormatFalse\pr\corerun.exe2.065 ns0.0416 ns0.0389 ns0.98
Author:stephentoub
Assignees:stephentoub
Labels:

area-System.Runtime

Milestone:-

@danmoseley

Copy link
Copy Markdown
Contributor

Do you think that TrimWhiteSpaceAndNull can be improved also? It's on the "not a boolean" path.

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Do you think that TrimWhiteSpaceAndNull can be improved also?

I don't see anything about the implementation that can be meaningfully improved without restoring to unsafe code, at least not until the JIT recognizes some sort of backward iteration pattern for bounds-check elimination.

We can, however, push that whole trimming path off into a separate function, making it a bit cheaper to invoke the main parsing routine, along with being able to add a few more checks to more quickly weed out bad inputs.

MethodToolchainvalueMeanErrorRatio
TryParse\main\corerun.exeTrue18.4991 ns0.0338 ns1.00
TryParse\pr\corerun.exeTrue9.2014 ns0.0485 ns0.50
TryParse\main\corerun.exe015.6529 ns0.0662 ns1.00
TryParse\pr\corerun.exe01.2378 ns0.0064 ns0.08
TryParse\main\corerun.exeBogus17.7503 ns0.0832 ns1.00
TryParse\pr\corerun.exeBogus6.8170 ns0.0342 ns0.38
TryParse\main\corerun.exeFalse7.8471 ns0.0274 ns1.00
TryParse\pr\corerun.exeFalse1.4798 ns0.0066 ns0.19
TryParse\main\corerun.exeTRUE8.1593 ns0.0226 ns1.00
TryParse\pr\corerun.exeTRUE0.8097 ns0.0060 ns0.10
TryParse\main\corerun.exefalse7.9468 ns0.0555 ns1.00
TryParse\pr\corerun.exefalse1.4835 ns0.0090 ns0.19
TryParse\main\corerun.exetrue7.1882 ns0.0645 ns1.00
TryParse\pr\corerun.exetrue0.8110 ns0.0068 ns0.11

@danmoseley

Copy link
Copy Markdown
Contributor

Assuming that once we get to trimming the result will usually be a failure, I wonder whether IndexOfAny(char[] { 'e', 'E' } might allow bailing out quickly if the input is large.

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Assuming that once we get to trimming the result will usually be a failure, I wonder whether IndexOfAny(char[] { 'e', 'E' } might allow bailing out quickly if the input is large.

Have you seen any real-world cases of large inputs filled with whitespace and nulls being passed to bool.{Try}Parse?

@uweigand

Copy link
Copy Markdown
Contributor

This commit introduced serious regressions on s390x, about 40 library test cases now fail.

The problem seems to be that this (and similar lines):

BinaryPrimitives.WriteUInt64LittleEndian(MemoryMarshal.AsBytes(destination), 0x65007500720054); // "True"

is incorrect on big-endian systems. The destination memory will be set up as the following bytes:

 54 00 72 00 75 00 65 00

while on a big-endian system, the string should actually be:

 00 54 00 72 00 75 00 65

I'm currently testing a fix.

@uweigand

Copy link
Copy Markdown
Contributor

I'm currently testing a fix.

This is now #65078

@EgorBo

Copy link
Copy Markdown
Member

Improvements: dotnet/perf-autofiling-issues#3529

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Improvements

Always nice when what you saw locally is mirrored by the lab subsequently :)

@ghostghost locked as resolved and limited conversation to collaborators Mar 17, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@stephentoub@danmoseley@uweigand@EgorBo@jkotas@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Streamline bool.TryParse/Format - #64782

Merged
stephentoub merged 2 commits into
dotnet:mainfrom
stephentoub:boolparseformat
Feb 7, 2022
Merged

Streamline bool.TryParse/Format#64782
stephentoub merged 2 commits into
dotnet:mainfrom
stephentoub:boolparseformat

Conversation

@stephentoub

@stephentoubstephentoub commented Feb 4, 2022

Copy link
Copy Markdown
Member
privatechar[]_true=newchar[]{'T','r','u','e'};privatechar[]_false=newchar[]{'F','a','l','s','e'};privatechar[]_somethingElse=newchar[]{'O','t','h','e','r'};[Benchmark]publicboolParseTrue()=>bool.TryParse(_true,out_);[Benchmark]publicboolParseFalse()=>bool.TryParse(_false,out_);[Benchmark]publicboolParseSomethingElse()=>bool.TryParse(_somethingElse,out_);[Benchmark]publicboolFormatTrue()=>true.TryFormat(_true,out_);[Benchmark]publicboolFormatFalse()=>false.TryFormat(_false,out_);
MethodToolchainMeanErrorStdDevRatio
ParseTrue\main\corerun.exe7.311 ns0.0171 ns0.0142 ns1.00
ParseTrue\pr\corerun.exe1.149 ns0.0243 ns0.0203 ns0.16
ParseFalse\main\corerun.exe8.749 ns0.0569 ns0.0504 ns1.00
ParseFalse\pr\corerun.exe2.309 ns0.0572 ns0.0477 ns0.26
ParseSomethingElse\main\corerun.exe17.638 ns0.1478 ns0.1382 ns1.00
ParseSomethingElse\pr\corerun.exe8.219 ns0.0511 ns0.0453 ns0.47
FormatTrue\main\corerun.exe3.117 ns0.0245 ns0.0204 ns1.00
FormatTrue\pr\corerun.exe2.000 ns0.0287 ns0.0269 ns0.64
FormatFalse\main\corerun.exe2.101 ns0.0363 ns0.0322 ns1.00
FormatFalse\pr\corerun.exe2.065 ns0.0416 ns0.0389 ns0.98

@ghost

ghost commented Feb 4, 2022

Copy link
Copy Markdown

I couldn't figure out the best area label to add to this PR. If you have write-permissions please help me learn by adding exactly one area label.

Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
@ghost

ghost commented Feb 4, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-runtime
See info in area-owners.md if you want to be subscribed.

Issue Details
privatechar[]_true=newchar[]{'T','r','u','e'};privatechar[]_false=newchar[]{'F','a','l','s','e'};privatechar[]_somethingElse=newchar[]{'O','t','h','e','r'};[Benchmark]publicboolParseTrue()=>bool.TryParse(_true,out_);[Benchmark]publicboolParseFalse()=>bool.TryParse(_false,out_);[Benchmark]publicboolParseSomethingElse()=>bool.TryParse(_somethingElse,out_);[Benchmark]publicboolFormatTrue()=>true.TryFormat(_true,out_);[Benchmark]publicboolFormatFalse()=>false.TryFormat(_false,out_);
MethodToolchainMeanErrorStdDevRatio
ParseTrue\main\corerun.exe7.311 ns0.0171 ns0.0142 ns1.00
ParseTrue\pr\corerun.exe1.149 ns0.0243 ns0.0203 ns0.16
ParseFalse\main\corerun.exe8.749 ns0.0569 ns0.0504 ns1.00
ParseFalse\pr\corerun.exe2.309 ns0.0572 ns0.0477 ns0.26
ParseSomethingElse\main\corerun.exe17.638 ns0.1478 ns0.1382 ns1.00
ParseSomethingElse\pr\corerun.exe8.219 ns0.0511 ns0.0453 ns0.47
FormatTrue\main\corerun.exe3.117 ns0.0245 ns0.0204 ns1.00
FormatTrue\pr\corerun.exe2.000 ns0.0287 ns0.0269 ns0.64
FormatFalse\main\corerun.exe2.101 ns0.0363 ns0.0322 ns1.00
FormatFalse\pr\corerun.exe2.065 ns0.0416 ns0.0389 ns0.98
Author:stephentoub
Assignees:stephentoub
Labels:

area-System.Runtime

Milestone:-

@danmoseley

Copy link
Copy Markdown
Contributor

Do you think that TrimWhiteSpaceAndNull can be improved also? It's on the "not a boolean" path.

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Do you think that TrimWhiteSpaceAndNull can be improved also?

I don't see anything about the implementation that can be meaningfully improved without restoring to unsafe code, at least not until the JIT recognizes some sort of backward iteration pattern for bounds-check elimination.

We can, however, push that whole trimming path off into a separate function, making it a bit cheaper to invoke the main parsing routine, along with being able to add a few more checks to more quickly weed out bad inputs.

MethodToolchainvalueMeanErrorRatio
TryParse\main\corerun.exeTrue18.4991 ns0.0338 ns1.00
TryParse\pr\corerun.exeTrue9.2014 ns0.0485 ns0.50
TryParse\main\corerun.exe015.6529 ns0.0662 ns1.00
TryParse\pr\corerun.exe01.2378 ns0.0064 ns0.08
TryParse\main\corerun.exeBogus17.7503 ns0.0832 ns1.00
TryParse\pr\corerun.exeBogus6.8170 ns0.0342 ns0.38
TryParse\main\corerun.exeFalse7.8471 ns0.0274 ns1.00
TryParse\pr\corerun.exeFalse1.4798 ns0.0066 ns0.19
TryParse\main\corerun.exeTRUE8.1593 ns0.0226 ns1.00
TryParse\pr\corerun.exeTRUE0.8097 ns0.0060 ns0.10
TryParse\main\corerun.exefalse7.9468 ns0.0555 ns1.00
TryParse\pr\corerun.exefalse1.4835 ns0.0090 ns0.19
TryParse\main\corerun.exetrue7.1882 ns0.0645 ns1.00
TryParse\pr\corerun.exetrue0.8110 ns0.0068 ns0.11

@danmoseley

Copy link
Copy Markdown
Contributor

Assuming that once we get to trimming the result will usually be a failure, I wonder whether IndexOfAny(char[] { 'e', 'E' } might allow bailing out quickly if the input is large.

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Assuming that once we get to trimming the result will usually be a failure, I wonder whether IndexOfAny(char[] { 'e', 'E' } might allow bailing out quickly if the input is large.

Have you seen any real-world cases of large inputs filled with whitespace and nulls being passed to bool.{Try}Parse?

@uweigand

Copy link
Copy Markdown
Contributor

This commit introduced serious regressions on s390x, about 40 library test cases now fail.

The problem seems to be that this (and similar lines):

BinaryPrimitives.WriteUInt64LittleEndian(MemoryMarshal.AsBytes(destination), 0x65007500720054); // "True"

is incorrect on big-endian systems. The destination memory will be set up as the following bytes:

 54 00 72 00 75 00 65 00

while on a big-endian system, the string should actually be:

 00 54 00 72 00 75 00 65

I'm currently testing a fix.

@uweigand

Copy link
Copy Markdown
Contributor

I'm currently testing a fix.

This is now #65078

@EgorBo

Copy link
Copy Markdown
Member

Improvements: dotnet/perf-autofiling-issues#3529

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Improvements

Always nice when what you saw locally is mirrored by the lab subsequently :)

@ghostghost locked as resolved and limited conversation to collaborators Mar 17, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@stephentoub@danmoseley@uweigand@EgorBo@jkotas@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Streamline bool.TryParse/Format - #64782

Merged
stephentoub merged 2 commits into
dotnet:mainfrom
stephentoub:boolparseformat
Feb 7, 2022
Merged

Streamline bool.TryParse/Format#64782
stephentoub merged 2 commits into
dotnet:mainfrom
stephentoub:boolparseformat

Conversation

@stephentoub

@stephentoubstephentoub commented Feb 4, 2022

Copy link
Copy Markdown
Member
privatechar[]_true=newchar[]{'T','r','u','e'};privatechar[]_false=newchar[]{'F','a','l','s','e'};privatechar[]_somethingElse=newchar[]{'O','t','h','e','r'};[Benchmark]publicboolParseTrue()=>bool.TryParse(_true,out_);[Benchmark]publicboolParseFalse()=>bool.TryParse(_false,out_);[Benchmark]publicboolParseSomethingElse()=>bool.TryParse(_somethingElse,out_);[Benchmark]publicboolFormatTrue()=>true.TryFormat(_true,out_);[Benchmark]publicboolFormatFalse()=>false.TryFormat(_false,out_);
MethodToolchainMeanErrorStdDevRatio
ParseTrue\main\corerun.exe7.311 ns0.0171 ns0.0142 ns1.00
ParseTrue\pr\corerun.exe1.149 ns0.0243 ns0.0203 ns0.16
ParseFalse\main\corerun.exe8.749 ns0.0569 ns0.0504 ns1.00
ParseFalse\pr\corerun.exe2.309 ns0.0572 ns0.0477 ns0.26
ParseSomethingElse\main\corerun.exe17.638 ns0.1478 ns0.1382 ns1.00
ParseSomethingElse\pr\corerun.exe8.219 ns0.0511 ns0.0453 ns0.47
FormatTrue\main\corerun.exe3.117 ns0.0245 ns0.0204 ns1.00
FormatTrue\pr\corerun.exe2.000 ns0.0287 ns0.0269 ns0.64
FormatFalse\main\corerun.exe2.101 ns0.0363 ns0.0322 ns1.00
FormatFalse\pr\corerun.exe2.065 ns0.0416 ns0.0389 ns0.98

@ghost

ghost commented Feb 4, 2022

Copy link
Copy Markdown

I couldn't figure out the best area label to add to this PR. If you have write-permissions please help me learn by adding exactly one area label.

Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
Comment threadsrc/libraries/System.Private.CoreLib/src/System/Boolean.cs Outdated
@ghost

ghost commented Feb 4, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-runtime
See info in area-owners.md if you want to be subscribed.

Issue Details
privatechar[]_true=newchar[]{'T','r','u','e'};privatechar[]_false=newchar[]{'F','a','l','s','e'};privatechar[]_somethingElse=newchar[]{'O','t','h','e','r'};[Benchmark]publicboolParseTrue()=>bool.TryParse(_true,out_);[Benchmark]publicboolParseFalse()=>bool.TryParse(_false,out_);[Benchmark]publicboolParseSomethingElse()=>bool.TryParse(_somethingElse,out_);[Benchmark]publicboolFormatTrue()=>true.TryFormat(_true,out_);[Benchmark]publicboolFormatFalse()=>false.TryFormat(_false,out_);
MethodToolchainMeanErrorStdDevRatio
ParseTrue\main\corerun.exe7.311 ns0.0171 ns0.0142 ns1.00
ParseTrue\pr\corerun.exe1.149 ns0.0243 ns0.0203 ns0.16
ParseFalse\main\corerun.exe8.749 ns0.0569 ns0.0504 ns1.00
ParseFalse\pr\corerun.exe2.309 ns0.0572 ns0.0477 ns0.26
ParseSomethingElse\main\corerun.exe17.638 ns0.1478 ns0.1382 ns1.00
ParseSomethingElse\pr\corerun.exe8.219 ns0.0511 ns0.0453 ns0.47
FormatTrue\main\corerun.exe3.117 ns0.0245 ns0.0204 ns1.00
FormatTrue\pr\corerun.exe2.000 ns0.0287 ns0.0269 ns0.64
FormatFalse\main\corerun.exe2.101 ns0.0363 ns0.0322 ns1.00
FormatFalse\pr\corerun.exe2.065 ns0.0416 ns0.0389 ns0.98
Author:stephentoub
Assignees:stephentoub
Labels:

area-System.Runtime

Milestone:-

@danmoseley

Copy link
Copy Markdown
Contributor

Do you think that TrimWhiteSpaceAndNull can be improved also? It's on the "not a boolean" path.

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Do you think that TrimWhiteSpaceAndNull can be improved also?

I don't see anything about the implementation that can be meaningfully improved without restoring to unsafe code, at least not until the JIT recognizes some sort of backward iteration pattern for bounds-check elimination.

We can, however, push that whole trimming path off into a separate function, making it a bit cheaper to invoke the main parsing routine, along with being able to add a few more checks to more quickly weed out bad inputs.

MethodToolchainvalueMeanErrorRatio
TryParse\main\corerun.exeTrue18.4991 ns0.0338 ns1.00
TryParse\pr\corerun.exeTrue9.2014 ns0.0485 ns0.50
TryParse\main\corerun.exe015.6529 ns0.0662 ns1.00
TryParse\pr\corerun.exe01.2378 ns0.0064 ns0.08
TryParse\main\corerun.exeBogus17.7503 ns0.0832 ns1.00
TryParse\pr\corerun.exeBogus6.8170 ns0.0342 ns0.38
TryParse\main\corerun.exeFalse7.8471 ns0.0274 ns1.00
TryParse\pr\corerun.exeFalse1.4798 ns0.0066 ns0.19
TryParse\main\corerun.exeTRUE8.1593 ns0.0226 ns1.00
TryParse\pr\corerun.exeTRUE0.8097 ns0.0060 ns0.10
TryParse\main\corerun.exefalse7.9468 ns0.0555 ns1.00
TryParse\pr\corerun.exefalse1.4835 ns0.0090 ns0.19
TryParse\main\corerun.exetrue7.1882 ns0.0645 ns1.00
TryParse\pr\corerun.exetrue0.8110 ns0.0068 ns0.11

@danmoseley

Copy link
Copy Markdown
Contributor

Assuming that once we get to trimming the result will usually be a failure, I wonder whether IndexOfAny(char[] { 'e', 'E' } might allow bailing out quickly if the input is large.

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Assuming that once we get to trimming the result will usually be a failure, I wonder whether IndexOfAny(char[] { 'e', 'E' } might allow bailing out quickly if the input is large.

Have you seen any real-world cases of large inputs filled with whitespace and nulls being passed to bool.{Try}Parse?

@uweigand

Copy link
Copy Markdown
Contributor

This commit introduced serious regressions on s390x, about 40 library test cases now fail.

The problem seems to be that this (and similar lines):

BinaryPrimitives.WriteUInt64LittleEndian(MemoryMarshal.AsBytes(destination), 0x65007500720054); // "True"

is incorrect on big-endian systems. The destination memory will be set up as the following bytes:

 54 00 72 00 75 00 65 00

while on a big-endian system, the string should actually be:

 00 54 00 72 00 75 00 65

I'm currently testing a fix.

@uweigand

Copy link
Copy Markdown
Contributor

I'm currently testing a fix.

This is now #65078

@EgorBo

Copy link
Copy Markdown
Member

Improvements: dotnet/perf-autofiling-issues#3529

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Improvements

Always nice when what you saw locally is mirrored by the lab subsequently :)

@ghostghost locked as resolved and limited conversation to collaborators Mar 17, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@stephentoub@danmoseley@uweigand@EgorBo@jkotas@jeffhandley