Skip to content

Reduce overhead of calling into SearchValues - #86046

Merged
stephentoub merged 1 commit into
dotnet:mainfrom
MihaZupan:searchvalues-call-overhead
May 15, 2023
Merged

Reduce overhead of calling into SearchValues#86046
stephentoub merged 1 commit into
dotnet:mainfrom
MihaZupan:searchvalues-call-overhead

Conversation

@MihaZupan

@MihaZupanMihaZupan commented May 10, 2023

Copy link
Copy Markdown
Member

I recommend looking at the diff without whitespace changes.

The idea here is pretty simple - instead of passing the bitmaps to worker methods by value, we pass a ref and have the callee do the load. This simplifies both the call site and callee.

Ascii chars
MethodToolchainLengthMatchAtStartMeanErrorRatio
CharAnymain8False3.874 ns0.0776 ns1.00
CharAnypr8False2.382 ns0.0584 ns0.62
CharAnyExceptmain8False2.526 ns0.0485 ns1.00
CharAnyExceptpr8False2.786 ns0.0633 ns1.11
CharAnymain8True3.895 ns0.0536 ns1.00
CharAnypr8True2.985 ns0.0487 ns0.77
CharAnyExceptmain8True3.194 ns0.0424 ns1.00
CharAnyExceptpr8True3.312 ns0.0629 ns1.04
CharAnymain16False3.901 ns0.0534 ns1.00
CharAnypr16False2.447 ns0.0529 ns0.63
CharAnyExceptmain16False2.555 ns0.0452 ns1.00
CharAnyExceptpr16False2.620 ns0.0572 ns1.03
CharAnymain16True4.152 ns0.1861 ns1.00
CharAnypr16True3.105 ns0.0843 ns0.75
CharAnyExceptmain16True3.219 ns0.0550 ns1.00
CharAnyExceptpr16True3.236 ns0.0399 ns1.01
CharAnymain17False4.096 ns0.0446 ns1.00
CharAnypr17False2.753 ns0.1530 ns0.67
CharAnyExceptmain17False3.671 ns0.0513 ns1.00
CharAnyExceptpr17False3.104 ns0.0359 ns0.85
CharAnymain17True5.536 ns0.0644 ns1.00
CharAnypr17True3.549 ns0.0553 ns0.64
CharAnyExceptmain17True3.927 ns0.0517 ns1.00
CharAnyExceptpr17True3.764 ns0.0573 ns0.96
CharAnymain32False4.075 ns0.0520 ns1.00
CharAnypr32False2.434 ns0.0288 ns0.60
CharAnyExceptmain32False3.694 ns0.0522 ns1.00
CharAnyExceptpr32False2.966 ns0.0092 ns0.80
CharAnymain32True5.368 ns0.0267 ns1.00
CharAnypr32True3.360 ns0.0110 ns0.63
CharAnyExceptmain32True3.784 ns0.0121 ns1.00
CharAnyExceptpr32True3.566 ns0.0092 ns0.94
CharAnymain33False5.504 ns0.0177 ns1.00
CharAnypr33False3.781 ns0.3894 ns0.69
CharAnyExceptmain33False4.241 ns0.0282 ns1.00
CharAnyExceptpr33False3.607 ns0.0094 ns0.85
CharAnymain33True4.775 ns0.0209 ns1.00
CharAnypr33True3.023 ns0.0111 ns0.63
CharAnyExceptmain33True3.988 ns0.0069 ns1.00
CharAnyExceptpr33True2.678 ns0.0090 ns0.67
CharAnymain1000False32.512 ns0.7871 ns1.00
CharAnypr1000False33.715 ns0.1426 ns1.04
CharAnyExceptmain1000False37.156 ns0.1488 ns1.00
CharAnyExceptpr1000False36.509 ns0.2694 ns0.98
CharAnymain1000True4.763 ns0.0100 ns1.00
CharAnypr1000True3.033 ns0.0184 ns0.64
CharAnyExceptmain1000True3.989 ns0.0097 ns1.00
CharAnyExceptpr1000True2.914 ns0.1544 ns0.73
Ascii bytes
MethodToolchainLengthMatchAtStartMeanErrorRatio
ByteAnymain8False3.658 ns0.0493 ns1.00
ByteAnypr8False2.363 ns0.0344 ns0.65
ByteAnyExceptmain8False2.882 ns0.0826 ns1.00
ByteAnyExceptpr8False2.934 ns0.0523 ns1.02
ByteAnymain8True4.621 ns0.0994 ns1.00
ByteAnypr8True3.408 ns0.1378 ns0.74
ByteAnyExceptmain8True3.381 ns0.0493 ns1.00
ByteAnyExceptpr8True3.117 ns0.0641 ns0.92
ByteAnymain16False3.691 ns0.0518 ns1.00
ByteAnypr16False2.423 ns0.0581 ns0.66
ByteAnyExceptmain16False2.769 ns0.0562 ns1.00
ByteAnyExceptpr16False2.880 ns0.0363 ns1.04
ByteAnymain16True4.518 ns0.2867 ns1.00
ByteAnypr16True3.256 ns0.0565 ns0.73
ByteAnyExceptmain16True3.397 ns0.0475 ns1.00
ByteAnyExceptpr16True3.136 ns0.0546 ns0.92
ByteAnymain17False3.741 ns0.0710 ns1.00
ByteAnypr17False3.124 ns0.0432 ns0.84
ByteAnyExceptmain17False3.130 ns0.0536 ns1.00
ByteAnyExceptpr17False3.126 ns0.1198 ns1.00
ByteAnymain17True5.326 ns0.1132 ns1.00
ByteAnypr17True3.720 ns0.0843 ns0.70
ByteAnyExceptmain17True3.491 ns0.0510 ns1.00
ByteAnyExceptpr17True3.757 ns0.0458 ns1.08
ByteAnymain32False3.731 ns0.0761 ns1.00
ByteAnypr32False2.990 ns0.0076 ns0.80
ByteAnyExceptmain32False3.111 ns0.0474 ns1.00
ByteAnyExceptpr32False2.789 ns0.0119 ns0.90
ByteAnymain32True4.691 ns0.0193 ns1.00
ByteAnypr32True3.571 ns0.0215 ns0.76
ByteAnyExceptmain32True3.330 ns0.0110 ns1.00
ByteAnyExceptpr32True3.592 ns0.0159 ns1.08
ByteAnymain33False4.261 ns0.0110 ns1.00
ByteAnypr33False3.299 ns0.0268 ns0.77
ByteAnyExceptmain33False3.775 ns0.0133 ns1.00
ByteAnyExceptpr33False3.761 ns0.0887 ns1.00
ByteAnymain33True3.117 ns0.0054 ns1.00
ByteAnypr33True2.593 ns0.0092 ns0.83
ByteAnyExceptmain33True3.087 ns0.0104 ns1.00
ByteAnyExceptpr33True2.843 ns0.0157 ns0.92
ByteAnymain1000False31.832 ns0.1279 ns1.00
ByteAnypr1000False29.271 ns0.1388 ns0.92
ByteAnyExceptmain1000False34.060 ns0.1269 ns1.00
ByteAnyExceptpr1000False33.658 ns0.0880 ns0.99
ByteAnymain1000True3.132 ns0.0133 ns1.00
ByteAnypr1000True2.602 ns0.0148 ns0.83
ByteAnyExceptmain1000True3.091 ns0.0115 ns1.00
ByteAnyExceptpr1000True2.872 ns0.0269 ns0.93
Any bytes
MethodToolchainLengthMatchAtStartMeanErrorRatio
ByteAny256main8False3.743 ns0.0655 ns1.00
ByteAny256pr8False3.446 ns0.0439 ns0.92
ByteAnyExcept256main8False3.568 ns0.0637 ns1.00
ByteAnyExcept256pr8False3.115 ns0.0827 ns0.87
ByteAny256main8True3.970 ns0.1732 ns1.00
ByteAny256pr8True3.899 ns0.0453 ns0.99
ByteAnyExcept256main8True3.778 ns0.0519 ns1.00
ByteAnyExcept256pr8True3.793 ns0.0545 ns1.00
ByteAny256main16False3.733 ns0.0431 ns1.00
ByteAny256pr16False3.449 ns0.0441 ns0.92
ByteAnyExcept256main16False3.544 ns0.0416 ns1.00
ByteAnyExcept256pr16False3.228 ns0.1061 ns0.91
ByteAny256main16True3.782 ns0.0628 ns1.00
ByteAny256pr16True3.917 ns0.0482 ns1.04
ByteAnyExcept256main16True3.759 ns0.0573 ns1.00
ByteAnyExcept256pr16True3.747 ns0.0459 ns1.00
ByteAny256main17False3.834 ns0.0462 ns1.00
ByteAny256pr17False3.403 ns0.0543 ns0.89
ByteAnyExcept256main17False4.030 ns0.0663 ns1.00
ByteAnyExcept256pr17False3.908 ns0.0469 ns0.97
ByteAny256main17True4.635 ns0.0738 ns1.00
ByteAny256pr17True4.234 ns0.0926 ns0.91
ByteAnyExcept256main17True4.318 ns0.0652 ns1.00
ByteAnyExcept256pr17True4.833 ns0.0464 ns1.12
ByteAny256main32False3.822 ns0.0640 ns1.00
ByteAny256pr32False3.232 ns0.0087 ns0.85
ByteAnyExcept256main32False3.993 ns0.0560 ns1.00
ByteAnyExcept256pr32False3.763 ns0.0167 ns0.94
ByteAny256main32True4.422 ns0.0089 ns1.00
ByteAny256pr32True3.922 ns0.0110 ns0.89
ByteAnyExcept256main32True4.084 ns0.0138 ns1.00
ByteAnyExcept256pr32True4.667 ns0.0212 ns1.14
ByteAny256main33False5.116 ns0.1425 ns1.00
ByteAny256pr33False4.365 ns0.0080 ns0.85
ByteAnyExcept256main33False5.238 ns0.0618 ns1.00
ByteAnyExcept256pr33False4.946 ns0.0179 ns0.94
ByteAny256main33True3.817 ns0.0207 ns1.00
ByteAny256pr33True3.473 ns0.0123 ns0.91
ByteAnyExcept256main33True3.784 ns0.0192 ns1.00
ByteAnyExcept256pr33True3.627 ns0.0255 ns0.96
ByteAny256main1000False45.522 ns0.1624 ns1.00
ByteAny256pr1000False44.646 ns0.1505 ns0.98
ByteAnyExcept256main1000False48.147 ns0.1320 ns1.00
ByteAnyExcept256pr1000False48.476 ns0.1263 ns1.01
ByteAny256main1000True3.800 ns0.0099 ns1.00
ByteAny256pr1000True3.474 ns0.0103 ns0.91
ByteAnyExcept256main1000True3.786 ns0.0254 ns1.00
ByteAnyExcept256pr1000True3.618 ns0.0138 ns0.96
Regex
MethodToolchainPatternOptionsMeanErrorRatio
Countmain(?i)Sherlock|(...)er|John|Baker [49]Compiled2.015 ms0.0079 ms1.00
Countpr(?i)Sherlock|(...)er|John|Baker [49]Compiled1.724 ms0.0038 ms0.86
Countmain[a-zA-Z]+ingCompiled3.764 ms0.0408 ms1.00
Countpr[a-zA-Z]+ingCompiled3.541 ms0.0115 ms0.94
MethodToolchainPatternOptionsMeanErrorRatio
Countmain(?i)Tom|Sawyer|Huckleberry|FinnCompiled25.67 ms0.156 ms1.00
Countpr(?i)Tom|Sawyer|Huckleberry|FinnCompiled22.56 ms0.123 ms0.88
Countmain[a-zA-Z]+ingCompiled98.31 ms0.329 ms1.00
Countpr[a-zA-Z]+ingCompiled93.61 ms1.213 ms0.95

Between this and #84370, I think this closes#81105 and closes#80447.

@MihaZupanMihaZupan added this to the 8.0.0 milestone May 10, 2023
@MihaZupanMihaZupan self-assigned this May 10, 2023
@ghost

Copy link
Copy Markdown

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

Issue Details

I recommend looking at the diff without whitespace changes.

The idea here is pretty simple - instead of passing the bitmaps to worker methods by value, we pass a ref and have the callee do the load. This simplifies both the call site and callee.

Ascii chars
MethodToolchainLengthMatchAtStartMeanErrorRatio
CharAnymain8False3.874 ns0.0776 ns1.00
CharAnypr8False2.382 ns0.0584 ns0.62
CharAnyExceptmain8False2.526 ns0.0485 ns1.00
CharAnyExceptpr8False2.786 ns0.0633 ns1.11
CharAnymain8True3.895 ns0.0536 ns1.00
CharAnypr8True2.985 ns0.0487 ns0.77
CharAnyExceptmain8True3.194 ns0.0424 ns1.00
CharAnyExceptpr8True3.312 ns0.0629 ns1.04
CharAnymain16False3.901 ns0.0534 ns1.00
CharAnypr16False2.447 ns0.0529 ns0.63
CharAnyExceptmain16False2.555 ns0.0452 ns1.00
CharAnyExceptpr16False2.620 ns0.0572 ns1.03
CharAnymain16True4.152 ns0.1861 ns1.00
CharAnypr16True3.105 ns0.0843 ns0.75
CharAnyExceptmain16True3.219 ns0.0550 ns1.00
CharAnyExceptpr16True3.236 ns0.0399 ns1.01
CharAnymain17False4.096 ns0.0446 ns1.00
CharAnypr17False2.753 ns0.1530 ns0.67
CharAnyExceptmain17False3.671 ns0.0513 ns1.00
CharAnyExceptpr17False3.104 ns0.0359 ns0.85
CharAnymain17True5.536 ns0.0644 ns1.00
CharAnypr17True3.549 ns0.0553 ns0.64
CharAnyExceptmain17True3.927 ns0.0517 ns1.00
CharAnyExceptpr17True3.764 ns0.0573 ns0.96
CharAnymain32False4.075 ns0.0520 ns1.00
CharAnypr32False2.434 ns0.0288 ns0.60
CharAnyExceptmain32False3.694 ns0.0522 ns1.00
CharAnyExceptpr32False2.966 ns0.0092 ns0.80
CharAnymain32True5.368 ns0.0267 ns1.00
CharAnypr32True3.360 ns0.0110 ns0.63
CharAnyExceptmain32True3.784 ns0.0121 ns1.00
CharAnyExceptpr32True3.566 ns0.0092 ns0.94
CharAnymain33False5.504 ns0.0177 ns1.00
CharAnypr33False3.781 ns0.3894 ns0.69
CharAnyExceptmain33False4.241 ns0.0282 ns1.00
CharAnyExceptpr33False3.607 ns0.0094 ns0.85
CharAnymain33True4.775 ns0.0209 ns1.00
CharAnypr33True3.023 ns0.0111 ns0.63
CharAnyExceptmain33True3.988 ns0.0069 ns1.00
CharAnyExceptpr33True2.678 ns0.0090 ns0.67
CharAnymain1000False32.512 ns0.7871 ns1.00
CharAnypr1000False33.715 ns0.1426 ns1.04
CharAnyExceptmain1000False37.156 ns0.1488 ns1.00
CharAnyExceptpr1000False36.509 ns0.2694 ns0.98
CharAnymain1000True4.763 ns0.0100 ns1.00
CharAnypr1000True3.033 ns0.0184 ns0.64
CharAnyExceptmain1000True3.989 ns0.0097 ns1.00
CharAnyExceptpr1000True2.914 ns0.1544 ns0.73
Ascii bytes
MethodToolchainLengthMatchAtStartMeanErrorRatio
ByteAny256main8False3.743 ns0.0655 ns1.00
ByteAny256pr8False3.446 ns0.0439 ns0.92
ByteAnyExcept256main8False3.568 ns0.0637 ns1.00
ByteAnyExcept256pr8False3.115 ns0.0827 ns0.87
ByteAny256main8True3.970 ns0.1732 ns1.00
ByteAny256pr8True3.899 ns0.0453 ns0.99
ByteAnyExcept256main8True3.778 ns0.0519 ns1.00
ByteAnyExcept256pr8True3.793 ns0.0545 ns1.00
ByteAny256main16False3.733 ns0.0431 ns1.00
ByteAny256pr16False3.449 ns0.0441 ns0.92
ByteAnyExcept256main16False3.544 ns0.0416 ns1.00
ByteAnyExcept256pr16False3.228 ns0.1061 ns0.91
ByteAny256main16True3.782 ns0.0628 ns1.00
ByteAny256pr16True3.917 ns0.0482 ns1.04
ByteAnyExcept256main16True3.759 ns0.0573 ns1.00
ByteAnyExcept256pr16True3.747 ns0.0459 ns1.00
ByteAny256main17False3.834 ns0.0462 ns1.00
ByteAny256pr17False3.403 ns0.0543 ns0.89
ByteAnyExcept256main17False4.030 ns0.0663 ns1.00
ByteAnyExcept256pr17False3.908 ns0.0469 ns0.97
ByteAny256main17True4.635 ns0.0738 ns1.00
ByteAny256pr17True4.234 ns0.0926 ns0.91
ByteAnyExcept256main17True4.318 ns0.0652 ns1.00
ByteAnyExcept256pr17True4.833 ns0.0464 ns1.12
ByteAny256main32False3.822 ns0.0640 ns1.00
ByteAny256pr32False3.232 ns0.0087 ns0.85
ByteAnyExcept256main32False3.993 ns0.0560 ns1.00
ByteAnyExcept256pr32False3.763 ns0.0167 ns0.94
ByteAny256main32True4.422 ns0.0089 ns1.00
ByteAny256pr32True3.922 ns0.0110 ns0.89
ByteAnyExcept256main32True4.084 ns0.0138 ns1.00
ByteAnyExcept256pr32True4.667 ns0.0212 ns1.14
ByteAny256main33False5.116 ns0.1425 ns1.00
ByteAny256pr33False4.365 ns0.0080 ns0.85
ByteAnyExcept256main33False5.238 ns0.0618 ns1.00
ByteAnyExcept256pr33False4.946 ns0.0179 ns0.94
ByteAny256main33True3.817 ns0.0207 ns1.00
ByteAny256pr33True3.473 ns0.0123 ns0.91
ByteAnyExcept256main33True3.784 ns0.0192 ns1.00
ByteAnyExcept256pr33True3.627 ns0.0255 ns0.96
ByteAny256main1000False45.522 ns0.1624 ns1.00
ByteAny256pr1000False44.646 ns0.1505 ns0.98
ByteAnyExcept256main1000False48.147 ns0.1320 ns1.00
ByteAnyExcept256pr1000False48.476 ns0.1263 ns1.01
ByteAny256main1000True3.800 ns0.0099 ns1.00
ByteAny256pr1000True3.474 ns0.0103 ns0.91
ByteAnyExcept256main1000True3.786 ns0.0254 ns1.00
ByteAnyExcept256pr1000True3.618 ns0.0138 ns0.96
Any bytes
MethodToolchainLengthMatchAtStartMeanErrorRatio
ByteAnymain8False3.658 ns0.0493 ns1.00
ByteAnypr8False2.363 ns0.0344 ns0.65
ByteAnyExceptmain8False2.882 ns0.0826 ns1.00
ByteAnyExceptpr8False2.934 ns0.0523 ns1.02
ByteAnymain8True4.621 ns0.0994 ns1.00
ByteAnypr8True3.408 ns0.1378 ns0.74
ByteAnyExceptmain8True3.381 ns0.0493 ns1.00
ByteAnyExceptpr8True3.117 ns0.0641 ns0.92
ByteAnymain16False3.691 ns0.0518 ns1.00
ByteAnypr16False2.423 ns0.0581 ns0.66
ByteAnyExceptmain16False2.769 ns0.0562 ns1.00
ByteAnyExceptpr16False2.880 ns0.0363 ns1.04
ByteAnymain16True4.518 ns0.2867 ns1.00
ByteAnypr16True3.256 ns0.0565 ns0.73
ByteAnyExceptmain16True3.397 ns0.0475 ns1.00
ByteAnyExceptpr16True3.136 ns0.0546 ns0.92
ByteAnymain17False3.741 ns0.0710 ns1.00
ByteAnypr17False3.124 ns0.0432 ns0.84
ByteAnyExceptmain17False3.130 ns0.0536 ns1.00
ByteAnyExceptpr17False3.126 ns0.1198 ns1.00
ByteAnymain17True5.326 ns0.1132 ns1.00
ByteAnypr17True3.720 ns0.0843 ns0.70
ByteAnyExceptmain17True3.491 ns0.0510 ns1.00
ByteAnyExceptpr17True3.757 ns0.0458 ns1.08
ByteAnymain32False3.731 ns0.0761 ns1.00
ByteAnypr32False2.990 ns0.0076 ns0.80
ByteAnyExceptmain32False3.111 ns0.0474 ns1.00
ByteAnyExceptpr32False2.789 ns0.0119 ns0.90
ByteAnymain32True4.691 ns0.0193 ns1.00
ByteAnypr32True3.571 ns0.0215 ns0.76
ByteAnyExceptmain32True3.330 ns0.0110 ns1.00
ByteAnyExceptpr32True3.592 ns0.0159 ns1.08
ByteAnymain33False4.261 ns0.0110 ns1.00
ByteAnypr33False3.299 ns0.0268 ns0.77
ByteAnyExceptmain33False3.775 ns0.0133 ns1.00
ByteAnyExceptpr33False3.761 ns0.0887 ns1.00
ByteAnymain33True3.117 ns0.0054 ns1.00
ByteAnypr33True2.593 ns0.0092 ns0.83
ByteAnyExceptmain33True3.087 ns0.0104 ns1.00
ByteAnyExceptpr33True2.843 ns0.0157 ns0.92
ByteAnymain1000False31.832 ns0.1279 ns1.00
ByteAnypr1000False29.271 ns0.1388 ns0.92
ByteAnyExceptmain1000False34.060 ns0.1269 ns1.00
ByteAnyExceptpr1000False33.658 ns0.0880 ns0.99
ByteAnymain1000True3.132 ns0.0133 ns1.00
ByteAnypr1000True2.602 ns0.0148 ns0.83
ByteAnyExceptmain1000True3.091 ns0.0115 ns1.00
ByteAnyExceptpr1000True2.872 ns0.0269 ns0.93
Regex
MethodToolchainPatternOptionsMeanErrorRatio
Countmain(?i)Sherlock|(...)er|John|Baker [49]Compiled2.015 ms0.0079 ms1.00
Countpr(?i)Sherlock|(...)er|John|Baker [49]Compiled1.724 ms0.0038 ms0.86
Countmain[a-zA-Z]+ingCompiled3.764 ms0.0408 ms1.00
Countpr[a-zA-Z]+ingCompiled3.541 ms0.0115 ms0.94
MethodToolchainPatternOptionsMeanErrorRatio
Countmain(?i)Tom|Sawyer|Huckleberry|FinnCompiled25.67 ms0.156 ms1.00
Countpr(?i)Tom|Sawyer|Huckleberry|FinnCompiled22.56 ms0.123 ms0.88
Countmain[a-zA-Z]+ingCompiled98.31 ms0.329 ms1.00
Countpr[a-zA-Z]+ingCompiled93.61 ms1.213 ms0.95

Between this and #84370, I think this closes #81105 and closes #80447.

Author:MihaZupan
Assignees:MihaZupan
Labels:

area-System.Buffers

Milestone:8.0.0

@stephentoub
stephentoub merged commit 80ffe5c into dotnet:mainMay 15, 2023
@ghostghost locked as resolved and limited conversation to collaborators Jun 14, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

2 participants

@MihaZupan@stephentoub