Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a dedicated Ascii.IsValid path #84881

Merged
merged 6 commits into from Apr 20, 2023
Merged

Conversation

MihaZupan
Copy link
Member

@MihaZupan MihaZupan commented Apr 15, 2023

Similar idea as IndexOf vs Contains.
IsValid only cares about the yes/no, so it can employ tricks like reading and or-ing together multiple vectors per iteration.

Method Toolchain Length Mean Error Ratio
AsciiIsValid_Byte main 1 3.235 ns 0.0070 ns 1.00
AsciiIsValid_Byte pr-original 1 2.433 ns 0.0066 ns 0.75
AsciiIsValid_Byte pr 1 2.221 ns 0.0072 ns 0.69
AsciiIsValid_Byte main 7 3.152 ns 0.0062 ns 1.00
AsciiIsValid_Byte pr-original 7 1.899 ns 0.0057 ns 0.60
AsciiIsValid_Byte pr 7 1.754 ns 0.0061 ns 0.56
AsciiIsValid_Byte main 8 3.168 ns 0.0064 ns 1.00
AsciiIsValid_Byte pr-original 8 1.899 ns 0.0055 ns 0.60
AsciiIsValid_Byte pr 8 1.862 ns 0.0012 ns 0.59
AsciiIsValid_Byte main 16 2.470 ns 0.0041 ns 1.00
AsciiIsValid_Byte pr-original 16 1.750 ns 0.0014 ns 0.71
AsciiIsValid_Byte pr 16 1.851 ns 0.0011 ns 0.75
AsciiIsValid_Byte main 32 2.947 ns 0.0059 ns 1.00
AsciiIsValid_Byte pr-original 32 1.748 ns 0.0013 ns 0.59
AsciiIsValid_Byte pr 32 1.851 ns 0.0012 ns 0.63
AsciiIsValid_Byte main 64 4.340 ns 0.0067 ns 1.00
AsciiIsValid_Byte pr-original 64 1.892 ns 0.0043 ns 0.44
AsciiIsValid_Byte pr 64 2.179 ns 0.0013 ns 0.50
AsciiIsValid_Byte main 128 5.044 ns 0.0398 ns 1.00
AsciiIsValid_Byte pr-original 128 2.469 ns 0.0072 ns 0.49
AsciiIsValid_Byte pr 128 2.444 ns 0.0065 ns 0.49
AsciiIsValid_Byte main 256 7.108 ns 0.0190 ns 1.00
AsciiIsValid_Byte pr-original 256 3.104 ns 0.0495 ns 0.44
AsciiIsValid_Byte pr 256 3.315 ns 0.0526 ns 0.47
AsciiIsValid_Byte main 1000 25.653 ns 0.0449 ns 1.00
AsciiIsValid_Byte pr-original 1000 6.195 ns 0.0042 ns 0.24
AsciiIsValid_Byte pr 1000 6.519 ns 0.0056 ns 0.25
AsciiIsValid_Byte main 10000 167.230 ns 0.0811 ns 1.00
AsciiIsValid_Byte pr-original 10000 53.478 ns 0.0281 ns 0.32
AsciiIsValid_Byte pr 10000 54.200 ns 0.0334 ns 0.32
Method Toolchain Length Mean Error Ratio
AsciiIsValid_Char main 1 3.578 ns 0.0085 ns 1.00
AsciiIsValid_Char pr-original 1 2.024 ns 0.0078 ns 0.57
AsciiIsValid_Char pr 1 1.749 ns 0.0083 ns 0.49
AsciiIsValid_Char main 7 3.668 ns 0.0109 ns 1.00
AsciiIsValid_Char pr-original 7 1.659 ns 0.0052 ns 0.45
AsciiIsValid_Char pr 7 1.962 ns 0.0077 ns 0.54
AsciiIsValid_Char main 8 2.793 ns 0.0064 ns 1.00
AsciiIsValid_Char pr-original 8 1.810 ns 0.0022 ns 0.65
AsciiIsValid_Char pr 8 1.913 ns 0.0032 ns 0.68
AsciiIsValid_Char main 16 3.418 ns 0.0023 ns 1.00
AsciiIsValid_Char pr-original 16 1.807 ns 0.0012 ns 0.53
AsciiIsValid_Char pr 16 1.881 ns 0.0014 ns 0.55
AsciiIsValid_Char main 32 4.015 ns 0.0068 ns 1.00
AsciiIsValid_Char pr-original 32 2.074 ns 0.0013 ns 0.52
AsciiIsValid_Char pr 32 1.900 ns 0.0014 ns 0.47
AsciiIsValid_Char main 64 4.970 ns 0.0299 ns 1.00
AsciiIsValid_Char pr-original 64 2.344 ns 0.0033 ns 0.47
AsciiIsValid_Char pr 64 2.400 ns 0.0110 ns 0.49
AsciiIsValid_Char main 128 6.941 ns 0.0275 ns 1.00
AsciiIsValid_Char pr-original 128 4.338 ns 0.0106 ns 0.63
AsciiIsValid_Char pr 128 3.542 ns 0.0118 ns 0.51
AsciiIsValid_Char main 256 10.511 ns 0.0302 ns 1.00
AsciiIsValid_Char pr-original 256 5.020 ns 0.0183 ns 0.48
AsciiIsValid_Char pr 256 5.043 ns 0.0134 ns 0.48
AsciiIsValid_Char main 1000 36.325 ns 0.1159 ns 1.00
AsciiIsValid_Char pr-original 1000 11.441 ns 0.0083 ns 0.32
AsciiIsValid_Char pr 1000 12.329 ns 0.0174 ns 0.34
AsciiIsValid_Char main 10000 279.953 ns 0.1557 ns 1.00
AsciiIsValid_Char pr-original 10000 101.407 ns 0.0657 ns 0.36
AsciiIsValid_Char pr 10000 100.405 ns 0.0688 ns 0.36

@MihaZupan MihaZupan added this to the 8.0.0 milestone Apr 15, 2023
@MihaZupan MihaZupan self-assigned this Apr 15, 2023
@ghost
Copy link

ghost commented Apr 15, 2023

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

Issue Details

Similar idea as IndexOf vs Contains.
IsValid only cares about the yes/no, so it can employ tricks like reading and or-ing together multiple vectors per iteration.

Method Toolchain Length Mean Error Ratio
IsValid_Byte main 1 3.234 ns 0.0271 ns 1.00
IsValid_Byte pr 1 2.429 ns 0.0223 ns 0.75
IsValid_Byte main 7 3.167 ns 0.0328 ns 1.00
IsValid_Byte pr 7 1.925 ns 0.0216 ns 0.61
IsValid_Byte main 8 3.188 ns 0.0239 ns 1.00
IsValid_Byte pr 8 1.954 ns 0.0258 ns 0.61
IsValid_Byte main 16 2.562 ns 0.0307 ns 1.00
IsValid_Byte pr 16 1.811 ns 0.0205 ns 0.71
IsValid_Byte main 32 3.405 ns 0.0329 ns 1.00
IsValid_Byte pr 32 1.815 ns 0.0193 ns 0.53
IsValid_Byte main 64 3.832 ns 0.0471 ns 1.00
IsValid_Byte pr 64 1.991 ns 0.0306 ns 0.52
IsValid_Byte main 128 4.615 ns 0.0393 ns 1.00
IsValid_Byte pr 128 2.467 ns 0.0259 ns 0.53
IsValid_Byte main 1000 18.710 ns 0.1963 ns 1.00
IsValid_Byte pr 1000 6.352 ns 0.0846 ns 0.34
IsValid_Byte main 10000 172.507 ns 1.3804 ns 1.00
IsValid_Byte pr 10000 55.183 ns 0.4532 ns 0.32
Method Toolchain Length Mean Error Ratio
IsValid_Char main 1 3.617 ns 0.0286 ns 1.00
IsValid_Char pr 1 2.052 ns 0.0243 ns 0.57
IsValid_Char main 7 3.651 ns 0.0355 ns 1.00
IsValid_Char pr 7 1.714 ns 0.0209 ns 0.47
IsValid_Char main 8 2.807 ns 0.0185 ns 1.00
IsValid_Char pr 8 1.878 ns 0.0328 ns 0.67
IsValid_Char main 16 3.574 ns 0.0701 ns 1.00
IsValid_Char pr 16 1.873 ns 0.0258 ns 0.52
IsValid_Char main 32 4.090 ns 0.0333 ns 1.00
IsValid_Char pr 32 2.152 ns 0.0288 ns 0.53
IsValid_Char main 64 5.034 ns 0.0670 ns 1.00
IsValid_Char pr 64 2.427 ns 0.0256 ns 0.48
IsValid_Char main 128 6.918 ns 0.1141 ns 1.00
IsValid_Char pr 128 4.358 ns 0.0414 ns 0.63
IsValid_Char main 1000 36.692 ns 0.3522 ns 1.00
IsValid_Char pr 1000 11.824 ns 0.1359 ns 0.32
IsValid_Char main 10000 287.754 ns 2.5790 ns 1.00
IsValid_Char pr 10000 104.102 ns 0.9829 ns 0.36
Author: MihaZupan
Assignees: MihaZupan
Labels:

area-System.Buffers

Milestone: 8.0.0

@MihaZupan MihaZupan merged commit 46e2597 into dotnet:main Apr 20, 2023
167 checks passed
@dotnet dotnet locked as resolved and limited conversation to collaborators May 20, 2023
Sign up for free to 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.

None yet

6 participants