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

Regressions around IndexOf #80441

Closed
performanceautofiler bot opened this issue Jan 10, 2023 · 13 comments
Closed

Regressions around IndexOf #80441

performanceautofiler bot opened this issue Jan 10, 2023 · 13 comments
Assignees
Labels

Comments

@performanceautofiler
Copy link

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Text.RegularExpressions.Tests.Perf_Regex_Industry_Leipzig

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
Count - Duration of single invocation 8.68 ms 11.31 ms 1.30 0.05 False

graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Text.RegularExpressions.Tests.Perf_Regex_Industry_Leipzig*'

Payloads

Baseline
Compare

Histogram

System.Text.RegularExpressions.Tests.Perf_Regex_Industry_Leipzig.Count(Pattern: "(?i)Twain", Options: None)


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 11.31371125 > 9.244280525862068.
IsChangePoint: Marked as a change because one of 10/27/2022 12:34:03 AM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -6.374166673789645 (T) = (0 -9603758.60660944) / Math.Sqrt((8648777551.858488 / (14)) + (541761443840.9534 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.09484229454698666 = (8771819.150979357 - 9603758.60660944) / 8771819.150979357 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

### Run Information
Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Tests.Perf_String

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
Replace_Char - Duration of single invocation 4.17 ns 5.58 ns 1.34 0.05 False Trace Trace
TrimEnd_CharArr - Duration of single invocation 15.10 ns 16.24 ns 1.08 0.04 False Trace Trace
Replace_Char - Duration of single invocation 4.13 ns 6.14 ns 1.49 0.04 False Trace Trace
Replace_String - Duration of single invocation 52.91 ns 56.12 ns 1.06 0.17 False Trace Trace
Replace_Char - Duration of single invocation 19.53 ns 22.33 ns 1.14 0.06 False Trace Trace

graph
graph
graph
graph
graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Tests.Perf_String*'

Payloads

Baseline
Compare

Histogram

System.Tests.Perf_String.Replace_Char(text: "This is a very nice sentence", oldChar: 'z', newChar: 'y')


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 5.5791697719305775 > 4.373588329296491.
IsChangePoint: Marked as a change because one of 11/11/2022 5:53:56 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -27.243637733037268 (T) = (0 -5.4979369389559425) / Math.Sqrt((0.00019304484897805758 / (14)) + (0.07992415633537059 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.32372669563033424 = (4.15337770032501 - 5.4979369389559425) / 4.15337770032501 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFBA9C250C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,28
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     ecx,di
       movzx     r8d,bx
       cmp       ecx,r8d
       je        near ptr M01_L03
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       call      qword ptr [7FFBAA1C16A8]; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       test      ebp,ebp
       jge       short M01_L00
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L00:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L04
M01_L01:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L02
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L02:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFBAA3A3000]
       mov       rax,r15
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L03:
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L04:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFBAA0FFFA8]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L01
; Total bytes of code 231

Compare Jit Disasm

; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFB002F50C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,38
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     edx,di
       movzx     ecx,bx
       cmp       edx,ecx
       je        near ptr M01_L05
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       mov       [rsp+34],edx
       movzx     edx,word ptr [rsp+34]
       lea       eax,[rdx-1]
       cmp       eax,0FE
       jae       short M01_L00
       movsx     rdx,dx
       call      qword ptr [7FFB008958E8]; System.PackedSpanHelpers.IndexOf[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       jmp       short M01_L01
M01_L00:
       mov       edx,[rsp+34]
       call      qword ptr [7FFB00C2FB58]; System.SpanHelpers.NonPackedIndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
M01_L01:
       test      ebp,ebp
       jge       short M01_L02
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L02:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L06
M01_L03:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L04
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L04:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFB00A6B438]
       mov       rax,r15
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L05:
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L06:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFB007E1888]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L03
; Total bytes of code 266

System.Tests.Perf_String.TrimEnd_CharArr(s: "Test ", c: [' ', ' '])


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 16.243533696179 > 15.84953257735199.
IsChangePoint: Marked as a change because one of 11/18/2022 8:48:12 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -13.227699752533349 (T) = (0 -16.421167827143552) / Math.Sqrt((0.08018990762463707 / (14)) + (0.08814426859036918 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.07970713135289936 = (15.208909296141657 - 16.421167827143552) / 15.208909296141657 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_String.TrimEnd_CharArr(System.String, Char[])
       mov       rcx,rdx
       mov       rdx,r8
       cmp       [rcx],ecx
       jmp       qword ptr [7FFCA57154F8]; System.String.TrimEnd(Char[])
; Total bytes of code 14
; System.String.TrimEnd(Char[])
       sub       rsp,28
       xor       eax,eax
       mov       [rsp+20],rax
       test      rdx,rdx
       je        short M01_L00
       mov       r8d,[rdx+8]
       test      r8d,r8d
       je        short M01_L00
       add       rdx,10
       mov       [rsp+20],rdx
       mov       rdx,[rsp+20]
       mov       r9d,2
       call      qword ptr [7FFCA5715528]; System.String.TrimHelper(Char*, Int32, System.Text.TrimType)
       nop
       add       rsp,28
       ret
M01_L00:
       mov       edx,2
       call      qword ptr [7FFCA5715510]
       nop
       add       rsp,28
       ret
; Total bytes of code 74

Compare Jit Disasm

; System.Tests.Perf_String.TrimEnd_CharArr(System.String, Char[])
       mov       rcx,rdx
       mov       rdx,r8
       cmp       [rcx],ecx
       jmp       qword ptr [7FFEA49954F8]; System.String.TrimEnd(Char[])
; Total bytes of code 14
; System.String.TrimEnd(Char[])
       sub       rsp,28
       xor       eax,eax
       mov       [rsp+20],rax
       test      rdx,rdx
       je        short M01_L00
       mov       r8d,[rdx+8]
       test      r8d,r8d
       je        short M01_L00
       add       rdx,10
       mov       [rsp+20],rdx
       mov       rdx,[rsp+20]
       mov       r9d,2
       call      qword ptr [7FFEA4995528]; System.String.TrimHelper(Char*, Int32, System.Text.TrimType)
       nop
       add       rsp,28
       ret
M01_L00:
       mov       edx,2
       call      qword ptr [7FFEA4995510]
       nop
       add       rsp,28
       ret
; Total bytes of code 74

System.Tests.Perf_String.Replace_Char(text: "Hello", oldChar: 'a', newChar: 'b')


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 6.141896447049398 > 4.345308369149102.
IsChangePoint: Marked as a change because one of 10/25/2022 2:34:53 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -77.67081568675944 (T) = (0 -6.195133441371548) / Math.Sqrt((0.000163412449150792 / (14)) + (0.02276838353402995 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.4972135604471777 = (4.137775401607522 - 6.195133441371548) / 4.137775401607522 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFBA9C550C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,28
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     ecx,di
       movzx     r8d,bx
       cmp       ecx,r8d
       je        near ptr M01_L03
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       call      qword ptr [7FFBAA1F16A8]; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       test      ebp,ebp
       jge       short M01_L00
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L00:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L04
M01_L01:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L02
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L02:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFBAA3D3000]
       mov       rax,r15
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L03:
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L04:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFBAA12FFA8]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L01
; Total bytes of code 231

Compare Jit Disasm

; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFB003350C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,38
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     edx,di
       movzx     ecx,bx
       cmp       edx,ecx
       je        near ptr M01_L05
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       mov       [rsp+34],edx
       movzx     edx,word ptr [rsp+34]
       lea       eax,[rdx-1]
       cmp       eax,0FE
       jae       short M01_L00
       movsx     rdx,dx
       call      qword ptr [7FFB008D58E8]; System.PackedSpanHelpers.IndexOf[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       jmp       short M01_L01
M01_L00:
       mov       edx,[rsp+34]
       call      qword ptr [7FFB00C6FB58]; System.SpanHelpers.NonPackedIndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
M01_L01:
       test      ebp,ebp
       jge       short M01_L02
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L02:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L06
M01_L03:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L04
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L04:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFB00AAB438]
       mov       rax,r15
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L05:
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L06:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFB00821888]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L03
; Total bytes of code 266

System.Tests.Perf_String.Replace_String(text: "This is a very nice sentence. This is another very nice sentence.", oldValue: "a", newValue: "")


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 56.12304519478277 > 55.71160747100109.
IsChangePoint: Marked as a change because one of 11/17/2022 7:01:39 PM, 11/18/2022 3:21:53 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -5.791124591809122 (T) = (0 -56.58363624443871) / Math.Sqrt((2.1664145734713496 / (14)) + (2.5689714504370484 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.05192214047934187 = (53.790707569530355 - 56.58363624443871) / 53.790707569530355 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_String.Replace_String(System.String, System.String, System.String)
       mov       rcx,rdx
       mov       rdx,r8
       mov       r8,r9
       cmp       [rcx],ecx
       jmp       qword ptr [7FFCE0E250D8]; System.String.Replace(System.String, System.String)
; Total bytes of code 17
; System.String.Replace(System.String, System.String)
       push      rbp
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbx
       sub       rsp,58
       lea       rbp,[rsp+20]
       xor       eax,eax
       mov       [rbp+8],rax
       vxorps    xmm4,xmm4,xmm4
       vmovdqa   xmmword ptr [rbp+10],xmm4
       vmovdqa   xmmword ptr [rbp+20],xmm4
       mov       [rbp+30],rax
       mov       rax,0C6A9C64BB2F3
       mov       [rbp],rax
       mov       rsi,rcx
       mov       rdi,rdx
       mov       rbx,r8
       test      rdi,rdi
       je        near ptr M01_L15
       mov       r14d,[rdi+8]
       test      r14d,r14d
       je        near ptr M01_L15
       test      rbx,rbx
       jne       short M01_L00
       mov       rbx,7FFCE0EC0008
M01_L00:
       test      [rsp],esp
       sub       rsp,200
       lea       rdx,[rsp+20]
       mov       [rbp+28],rdx
       mov       dword ptr [rbp+30],80
       xor       edx,edx
       mov       [rbp+18],rdx
       mov       [rbp+20],edx
       cmp       r14d,1
       jne       near ptr M01_L06
       cmp       dword ptr [rbx+8],1
       jne       short M01_L02
       movzx     edx,word ptr [rdi+0C]
       movzx     r8d,word ptr [rbx+0C]
       mov       rcx,rsi
       call      qword ptr [7FFCE0E250C0]; System.String.Replace(Char, Char)
       mov       rcx,0C6A9C64BB2F3
       cmp       [rbp],rcx
       je        short M01_L01
       call      CORINFO_HELP_FAIL_FAST
M01_L01:
       nop
       lea       rsp,[rbp+38]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L02:
       movzx     edi,word ptr [rdi+0C]
       xor       r15d,r15d
M01_L03:
       movsxd    rcx,r15d
       lea       rcx,[rsi+rcx*2+0C]
       mov       r8d,[rsi+8]
       sub       r8d,r15d
       movsx     rdx,di
       call      qword ptr [7FFCE13C16A8]; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       test      eax,eax
       jl        near ptr M01_L10
       add       r15d,eax
       mov       edx,r15d
       mov       ecx,[rbp+20]
       mov       rax,[rbp+28]
       mov       r8d,[rbp+30]
       cmp       ecx,r8d
       jae       short M01_L04
       mov       r8d,ecx
       mov       [rax+r8*4],edx
       inc       ecx
       mov       [rbp+20],ecx
       jmp       short M01_L05
M01_L04:
       lea       rcx,[rbp+18]
       call      qword ptr [7FFCE17ABC30]
M01_L05:
       inc       r15d
       jmp       short M01_L03
M01_L06:
       xor       r15d,r15d
M01_L07:
       movsxd    rcx,r15d
       lea       rcx,[rsi+rcx*2+0C]
       mov       edx,[rsi+8]
       sub       edx,r15d
       lea       r8,[rdi+0C]
       mov       r9d,r14d
       call      qword ptr [7FFCE12D1408]
       test      eax,eax
       jl        short M01_L10
       add       r15d,eax
       mov       edx,r15d
       mov       ecx,[rbp+20]
       mov       rax,[rbp+28]
       mov       r8d,[rbp+30]
       cmp       ecx,r8d
       jae       short M01_L08
       mov       r8d,ecx
       mov       [rax+r8*4],edx
       inc       ecx
       mov       [rbp+20],ecx
       jmp       short M01_L09
M01_L08:
       lea       rcx,[rbp+18]
       call      qword ptr [7FFCE17ABC30]
M01_L09:
       add       r15d,r14d
       jmp       short M01_L07
M01_L10:
       cmp       dword ptr [rbp+20],0
       jne       short M01_L12
       mov       rax,rsi
       mov       rcx,0C6A9C64BB2F3
       cmp       [rbp],rcx
       je        short M01_L11
       call      CORINFO_HELP_FAIL_FAST
M01_L11:
       nop
       lea       rsp,[rbp+38]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L12:
       mov       edx,r14d
       mov       ecx,[rbp+20]
       cmp       ecx,[rbp+30]
       ja        near ptr M01_L16
       mov       r8,[rbp+28]
       mov       [rbp+8],r8
       mov       [rbp+10],ecx
       mov       rcx,rsi
       mov       r8,rbx
       lea       r9,[rbp+8]
       call      qword ptr [7FFCE0E250F0]; System.String.ReplaceHelper(Int32, System.String, System.ReadOnlySpan`1<Int32>)
       mov       rdi,rax
       mov       rsi,[rbp+18]
       test      rsi,rsi
       je        short M01_L13
       xor       ecx,ecx
       mov       [rbp+18],rcx
       mov       rcx,7FFCE0D84D68
       mov       edx,31
       call      CORINFO_HELP_CLASSINIT_SHARED_DYNAMICCLASS
       mov       rcx,1A6AE807CD0
       mov       rcx,[rcx]
       mov       rdx,rsi
       xor       r8d,r8d
       cmp       [rcx],ecx
       call      qword ptr [7FFCE1799680]; System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1[[System.Int32, System.Private.CoreLib]].Return(Int32[], Boolean)
M01_L13:
       mov       rax,rdi
       mov       rcx,0C6A9C64BB2F3
       cmp       [rbp],rcx
       je        short M01_L14
       call      CORINFO_HELP_FAIL_FAST
M01_L14:
       nop
       lea       rsp,[rbp+38]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L15:
       mov       ecx,16A1
       mov       rdx,7FFCE0C64000
       call      CORINFO_HELP_STRCNS
       mov       rdx,rax
       mov       rcx,rdi
       call      qword ptr [7FFCE0E2DC78]
       int       3
M01_L16:
       call      qword ptr [7FFCE15734E0]
       int       3
; Total bytes of code 610

Compare Jit Disasm

; System.Tests.Perf_String.Replace_String(System.String, System.String, System.String)
       mov       rcx,rdx
       mov       rdx,r8
       mov       r8,r9
       cmp       [rcx],ecx
       jmp       qword ptr [7FFEA49B50D8]; System.String.Replace(System.String, System.String)
; Total bytes of code 17
; System.String.Replace(System.String, System.String)
       push      rbp
       push      r15
       push      r14
       push      r12
       push      rdi
       push      rsi
       push      rbx
       sub       rsp,60
       lea       rbp,[rsp+20]
       xor       eax,eax
       mov       [rbp+8],rax
       vxorps    xmm4,xmm4,xmm4
       vmovdqa   xmmword ptr [rbp+10],xmm4
       vmovdqa   xmmword ptr [rbp+20],xmm4
       vmovdqa   xmmword ptr [rbp+30],xmm4
       mov       rax,23C2D26E54EC
       mov       [rbp],rax
       mov       rsi,rcx
       mov       rdi,rdx
       mov       rbx,r8
       test      rdi,rdi
       je        near ptr M01_L17
       mov       r14d,[rdi+8]
       test      r14d,r14d
       je        near ptr M01_L17
       test      rbx,rbx
       jne       short M01_L00
       mov       rbx,7FFEA4A50008
M01_L00:
       test      [rsp],esp
       sub       rsp,200
       lea       rdx,[rsp+20]
       mov       [rbp+30],rdx
       mov       dword ptr [rbp+38],80
       xor       edx,edx
       mov       [rbp+20],rdx
       mov       [rbp+28],edx
       cmp       r14d,1
       jne       near ptr M01_L08
       cmp       dword ptr [rbx+8],1
       jne       short M01_L02
       movzx     edx,word ptr [rdi+0C]
       movzx     r8d,word ptr [rbx+0C]
       mov       rcx,rsi
       call      qword ptr [7FFEA49B50C0]; System.String.Replace(Char, Char)
       mov       rcx,23C2D26E54EC
       cmp       [rbp],rcx
       je        short M01_L01
       call      CORINFO_HELP_FAIL_FAST
M01_L01:
       nop
       lea       rsp,[rbp+40]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r12
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L02:
       movzx     edi,word ptr [rdi+0C]
       xor       r15d,r15d
M01_L03:
       movsxd    rdx,r15d
       lea       rcx,[rsi+rdx*2+0C]
       mov       r8d,[rsi+8]
       sub       r8d,r15d
       movsx     rdx,di
       mov       [rbp+1C],edx
       movzx     edx,word ptr [rbp+1C]
       dec       edx
       cmp       edx,0FE
       jae       short M01_L04
       movzx     edx,word ptr [rbp+1C]
       movsx     rdx,dx
       call      qword ptr [7FFEA4F558E8]; System.PackedSpanHelpers.IndexOf[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       r12d,eax
       jmp       short M01_L05
M01_L04:
       mov       edx,[rbp+1C]
       call      qword ptr [7FFEA52EFB58]; System.SpanHelpers.NonPackedIndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       r12d,eax
M01_L05:
       test      r12d,r12d
       jl        near ptr M01_L12
       lea       edx,[r15+r12]
       mov       ecx,[rbp+28]
       mov       rax,[rbp+30]
       mov       r8d,[rbp+38]
       cmp       ecx,r8d
       jae       short M01_L06
       mov       r8d,ecx
       mov       [rax+r8*4],edx
       inc       ecx
       mov       [rbp+28],ecx
       jmp       short M01_L07
M01_L06:
       lea       rcx,[rbp+20]
       call      qword ptr [7FFEA532DC48]
M01_L07:
       lea       r15d,[r15+r12+1]
       jmp       short M01_L03
M01_L08:
       xor       r15d,r15d
M01_L09:
       movsxd    rcx,r15d
       lea       rcx,[rsi+rcx*2+0C]
       mov       edx,[rsi+8]
       sub       edx,r15d
       lea       r8,[rdi+0C]
       mov       r9d,r14d
       call      qword ptr [7FFEA4E61408]
       mov       r12d,eax
       test      r12d,r12d
       jl        short M01_L12
       lea       edx,[r15+r12]
       mov       ecx,[rbp+28]
       mov       rax,[rbp+30]
       mov       r8d,[rbp+38]
       cmp       ecx,r8d
       jae       short M01_L10
       mov       r8d,ecx
       mov       [rax+r8*4],edx
       inc       ecx
       mov       [rbp+28],ecx
       jmp       short M01_L11
M01_L10:
       lea       rcx,[rbp+20]
       call      qword ptr [7FFEA532DC48]
M01_L11:
       add       r15d,r12d
       add       r15d,r14d
       jmp       short M01_L09
M01_L12:
       cmp       dword ptr [rbp+28],0
       jne       short M01_L14
       mov       rax,rsi
       mov       rcx,23C2D26E54EC
       cmp       [rbp],rcx
       je        short M01_L13
       call      CORINFO_HELP_FAIL_FAST
M01_L13:
       nop
       lea       rsp,[rbp+40]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r12
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L14:
       mov       edx,r14d
       mov       ecx,[rbp+28]
       cmp       ecx,[rbp+38]
       ja        near ptr M01_L18
       mov       r8,[rbp+30]
       mov       [rbp+8],r8
       mov       [rbp+10],ecx
       mov       rcx,rsi
       mov       r8,rbx
       lea       r9,[rbp+8]
       call      qword ptr [7FFEA49B50F0]; System.String.ReplaceHelper(Int32, System.String, System.ReadOnlySpan`1<Int32>)
       mov       rdi,rax
       mov       rsi,[rbp+20]
       test      rsi,rsi
       je        short M01_L15
       xor       ecx,ecx
       mov       [rbp+20],rcx
       mov       rcx,7FFEA4914DB8
       mov       edx,31
       call      CORINFO_HELP_CLASSINIT_SHARED_DYNAMICCLASS
       mov       rcx,22F6A407CD8
       mov       rcx,[rcx]
       mov       rdx,rsi
       xor       r8d,r8d
       cmp       [rcx],ecx
       call      qword ptr [7FFEA5335560]; System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1[[System.Int32, System.Private.CoreLib]].Return(Int32[], Boolean)
M01_L15:
       mov       rax,rdi
       mov       rcx,23C2D26E54EC
       cmp       [rbp],rcx
       je        short M01_L16
       call      CORINFO_HELP_FAIL_FAST
M01_L16:
       nop
       lea       rsp,[rbp+40]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r12
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L17:
       mov       ecx,16A1
       mov       rdx,7FFEA47F4000
       call      CORINFO_HELP_STRCNS
       mov       rdx,rax
       mov       rcx,rdi
       call      qword ptr [7FFEA49BDC78]
       int       3
M01_L18:
       call      qword ptr [7FFEA4ED3060]
       int       3
; Total bytes of code 667

System.Tests.Perf_String.Replace_Char(text: "This is a very nice sentence", oldChar: 'i', newChar: 'I')


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 22.330607657133392 > 20.635651568171316.
IsChangePoint: Marked as a change because one of 11/11/2022 5:53:56 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -19.533480701550356 (T) = (0 -22.051279089043497) / Math.Sqrt((0.04802330264672898 / (14)) + (0.36899131861666284 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.11991782255368702 = (19.69008675900985 - 22.051279089043497) / 19.69008675900985 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFBA9C050C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,28
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     ecx,di
       movzx     r8d,bx
       cmp       ecx,r8d
       je        near ptr M01_L03
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       call      qword ptr [7FFBAA1A16A8]; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       test      ebp,ebp
       jge       short M01_L00
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L00:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L04
M01_L01:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L02
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L02:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFBAA383000]; System.SpanHelpers.ReplaceValueType[[System.UInt16, System.Private.CoreLib]](UInt16 ByRef, UInt16 ByRef, UInt16, UInt16, UIntPtr)
       mov       rax,r15
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L03:
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L04:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFBAA0DFFA8]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L01
; Total bytes of code 231

Compare Jit Disasm

; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFB002E50C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,38
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     edx,di
       movzx     ecx,bx
       cmp       edx,ecx
       je        near ptr M01_L05
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       mov       [rsp+34],edx
       movzx     edx,word ptr [rsp+34]
       lea       eax,[rdx-1]
       cmp       eax,0FE
       jae       short M01_L00
       movsx     rdx,dx
       call      qword ptr [7FFB008858E8]; System.PackedSpanHelpers.IndexOf[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       jmp       short M01_L01
M01_L00:
       mov       edx,[rsp+34]
       call      qword ptr [7FFB00C1FB58]; System.SpanHelpers.NonPackedIndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
M01_L01:
       test      ebp,ebp
       jge       short M01_L02
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L02:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L06
M01_L03:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L04
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L04:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFB00A5B438]; System.SpanHelpers.ReplaceValueType[[System.UInt16, System.Private.CoreLib]](UInt16 ByRef, UInt16 ByRef, UInt16, UInt16, UIntPtr)
       mov       rax,r15
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L05:
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L06:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFB007D1888]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L03
; Total bytes of code 266

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Memory.Span<Int32>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
IndexOfAnyFourValues - Duration of single invocation 811.41 ns 893.12 ns 1.10 0.04 False
IndexOfAnyFiveValues - Duration of single invocation 857.19 ns 916.26 ns 1.07 0.08 False

graph
graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Memory.Span&lt;Int32&gt;*'

Payloads

Baseline
Compare

Histogram

System.Memory.Span<Int32>.IndexOfAnyFourValues(Size: 512)


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 893.115476054079 > 853.6086389195757.
IsChangePoint: Marked as a change because one of 10/26/2022 7:11:30 AM, 10/31/2022 10:23:25 PM, 11/11/2022 5:53:56 PM, 11/18/2022 8:48:12 PM, 12/12/2022 5:25:39 PM, 12/17/2022 10:44:50 PM, 12/21/2022 9:23:17 AM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -17.655352723675087 (T) = (0 -886.6573219555273) / Math.Sqrt((4.976405318076591 / (14)) + (550.567469208571 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.08955635836868671 = (813.7783008150718 - 886.6573219555273) / 813.7783008150718 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Int32&gt;.IndexOfAnyFiveValues(Size: 512)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 916.2596480801636 > 884.884366122159.
IsChangePoint: Marked as a change because one of 11/11/2022 5:53:56 PM, 11/18/2022 8:48:12 PM, 12/12/2022 5:25:39 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -14.792582161741155 (T) = (0 -919.5926411095774) / Math.Sqrt((234.02346260062512 / (14)) + (404.93175657466077 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.09481762636242623 = (839.9505259747775 - 919.5926411095774) / 839.9505259747775 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

@performanceautofiler
Copy link
Author

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Runtime.Intrinsics.Tests.Perf_Vector128Of<UInt32>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
GetHashCodeBenchmark - Duration of single invocation 12.75 ns 14.13 ns 1.11 0.08 False

graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Runtime.Intrinsics.Tests.Perf_Vector128Of&lt;UInt32&gt;*'

Payloads

Baseline
Compare

Histogram

System.Runtime.Intrinsics.Tests.Perf_Vector128Of<UInt32>.GetHashCodeBenchmark


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 14.132941831384793 > 13.387335926978809.
IsChangePoint: Marked as a change because one of 11/11/2022 5:53:56 PM, 12/6/2022 2:12:43 AM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -17.176141738513 (T) = (0 -13.989591827875858) / Math.Sqrt((0.0007810916178626517 / (14)) + (0.1656259823653341 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.09584694818004148 = (12.766008840111718 - 13.989591827875858) / 12.766008840111718 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

### Run Information
Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Collections.ContainsFalse<String>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
ImmutableArray - Duration of single invocation 922.24 μs 1.00 ms 1.09 0.07 False

graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Collections.ContainsFalse&lt;String&gt;*'

Payloads

Baseline
Compare

Histogram

System.Collections.ContainsFalse<String>.ImmutableArray(Size: 512)


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 1.0045689583333333 > 968.2637022058823.
IsChangePoint: Marked as a change because one of 11/11/2022 5:53:56 PM, 11/18/2022 7:31:41 AM, 12/6/2022 2:12:43 AM, 12/10/2022 11:25:25 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -18.009822583023116 (T) = (0 -998791.7504734081) / Math.Sqrt((3506840.8736660653 / (14)) + (582072133.3792906 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.08256211450680387 = (922618.4226190476 - 998791.7504734081) / 922618.4226190476 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Runtime.Intrinsics.Tests.Perf_Vector128Int

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
GetHashCodeBenchmark - Duration of single invocation 12.00 ns 13.72 ns 1.14 0.04 False

graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Runtime.Intrinsics.Tests.Perf_Vector128Int*'

Payloads

Baseline
Compare

Histogram

System.Runtime.Intrinsics.Tests.Perf_Vector128Int.GetHashCodeBenchmark


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 13.71529832043698 > 12.593974623891631.
IsChangePoint: Marked as a change because one of 12/17/2022 10:44:50 PM, 12/20/2022 1:34:12 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -17.507638186056457 (T) = (0 -13.656776919683798) / Math.Sqrt((0.00048440296326379207 / (14)) + (0.29443093202474474 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.13807876200528538 = (11.999852185643698 - 13.656776919683798) / 11.999852185643698 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Collections.Tests.Perf_BitArray

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
BitArrayLengthValueCtor - Duration of single invocation 16.00 ns 17.62 ns 1.10 0.10 False Trace Trace

graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Collections.Tests.Perf_BitArray*'

Payloads

Baseline
Compare

Histogram

System.Collections.Tests.Perf_BitArray.BitArrayLengthValueCtor(Size: 4)


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 17.616921724526627 > 17.07778368442704.
IsChangePoint: Marked as a change because one of 11/11/2022 5:53:56 PM, 12/28/2022 5:13:50 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -9.693484537631614 (T) = (0 -17.450616814465477) / Math.Sqrt((0.16588215485495053 / (14)) + (0.09152588382733112 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.07200681380607402 = (16.278456992739127 - 17.450616814465477) / 16.278456992739127 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Collections.Tests.Perf_BitArray.BitArrayLengthValueCtor()
       push      rdi
       push      rsi
       sub       rsp,28
       mov       rsi,rcx
       mov       rcx,offset MT_System.Collections.BitArray
       call      CORINFO_HELP_NEWSFAST
       mov       rdi,rax
       mov       edx,[rsi+30]
       mov       rcx,rdi
       mov       r8d,1
       call      qword ptr [7FFACCFE1C90]; System.Collections.BitArray..ctor(Int32, Boolean)
       mov       rax,rdi
       add       rsp,28
       pop       rsi
       pop       rdi
       ret
; Total bytes of code 55
; System.Collections.BitArray..ctor(Int32, Boolean)
       push      rdi
       push      rsi
       push      rbx
       sub       rsp,20
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       test      edi,edi
       jl        short M01_L01
       lea       edx,[rdi+1F]
       shr       edx,5
       movsxd    rdx,edx
       mov       rcx,offset MT_System.Int32[]
       call      CORINFO_HELP_NEWARR_1_VC
       lea       rcx,[rsi+8]
       mov       rdx,rax
       call      CORINFO_HELP_ASSIGN_REF
       mov       [rsi+10],edi
       test      bl,bl
       je        short M01_L00
       mov       rcx,[rsi+8]
       mov       edx,0FFFFFFFF
       call      qword ptr [7FFACD149E40]; System.Array.Fill[[System.Int32, System.Private.CoreLib]](Int32[], Int32)
       and       edi,1F
       jle       short M01_L00
       mov       rcx,[rsi+8]
       mov       edx,[rcx+8]
       lea       eax,[rdx-1]
       cmp       eax,edx
       jae       short M01_L02
       mov       edx,eax
       mov       eax,1
       shlx      eax,eax,edi
       dec       eax
       mov       [rcx+rdx*4+10],eax
M01_L00:
       xor       ecx,ecx
       mov       [rsi+14],ecx
       add       rsp,20
       pop       rbx
       pop       rsi
       pop       rdi
       ret
M01_L01:
       mov       ecx,775
       mov       rdx,7FFACCF23070
       call      CORINFO_HELP_STRCNS
       mov       rcx,rax
       mov       edx,edi
       call      qword ptr [7FFACCD27BD0]
       int       3
M01_L02:
       call      CORINFO_HELP_RNGCHKFAIL
       int       3
; Total bytes of code 165

Compare Jit Disasm

; System.Collections.Tests.Perf_BitArray.BitArrayLengthValueCtor()
       push      rdi
       push      rsi
       sub       rsp,28
       mov       rsi,rcx
       mov       rcx,offset MT_System.Collections.BitArray
       call      CORINFO_HELP_NEWSFAST
       mov       rdi,rax
       mov       edx,[rsi+30]
       mov       rcx,rdi
       mov       r8d,1
       call      qword ptr [7FFB00B51A08]; System.Collections.BitArray..ctor(Int32, Boolean)
       mov       rax,rdi
       add       rsp,28
       pop       rsi
       pop       rdi
       ret
; Total bytes of code 55
; System.Collections.BitArray..ctor(Int32, Boolean)
       push      rdi
       push      rsi
       push      rbx
       sub       rsp,20
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       test      edi,edi
       jl        short M01_L01
       lea       edx,[rdi+1F]
       shr       edx,5
       movsxd    rdx,edx
       mov       rcx,offset MT_System.Int32[]
       call      CORINFO_HELP_NEWARR_1_VC
       lea       rcx,[rsi+8]
       mov       rdx,rax
       call      CORINFO_HELP_ASSIGN_REF
       mov       [rsi+10],edi
       test      bl,bl
       je        short M01_L00
       mov       rcx,[rsi+8]
       mov       edx,0FFFFFFFF
       call      qword ptr [7FFB00CC7E40]; System.Array.Fill[[System.Int32, System.Private.CoreLib]](Int32[], Int32)
       and       edi,1F
       jle       short M01_L00
       mov       rcx,[rsi+8]
       mov       edx,[rcx+8]
       lea       eax,[rdx-1]
       cmp       eax,edx
       jae       short M01_L02
       mov       edx,eax
       mov       eax,1
       shlx      eax,eax,edi
       dec       eax
       mov       [rcx+rdx*4+10],eax
M01_L00:
       xor       ecx,ecx
       mov       [rsi+14],ecx
       add       rsp,20
       pop       rbx
       pop       rsi
       pop       rdi
       ret
M01_L01:
       mov       ecx,775
       mov       rdx,7FFB00AA43D8
       call      CORINFO_HELP_STRCNS
       mov       rcx,rax
       mov       edx,edi
       call      qword ptr [7FFB008ABAC8]
       int       3
M01_L02:
       call      CORINFO_HELP_RNGCHKFAIL
       int       3
; Total bytes of code 165

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Tests.Perf_HashCode

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
Add - Duration of single invocation 2.27 μs 2.63 μs 1.16 0.02 False Trace Trace

graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Tests.Perf_HashCode*'

Payloads

Baseline
Compare

Histogram

System.Tests.Perf_HashCode.Add


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 2.6299421589310827 > 2.3893048839166457.
IsChangePoint: Marked as a change because one of 12/17/2022 10:44:50 PM, 12/20/2022 1:34:12 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -17.174333240221383 (T) = (0 -2582.80874710574) / Math.Sqrt((22.479643633203445 / (14)) + (10448.706656867951 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.13458525790484424 = (2276.43425569906 - 2582.80874710574) / 2276.43425569906 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_HashCode.Add()
       push      rsi
       sub       rsp,40
       vxorps    xmm4,xmm4,xmm4
       vmovdqa   xmmword ptr [rsp+20],xmm4
       vmovdqa   xmmword ptr [rsp+30],xmm4
       xor       esi,esi
M00_L00:
       lea       rcx,[rsp+20]
       mov       edx,esi
       call      qword ptr [7FFE2CF071B0]; System.HashCode.Add(Int32)
       lea       rcx,[rsp+20]
       mov       edx,esi
       call      qword ptr [7FFE2CF071B0]; System.HashCode.Add(Int32)
       lea       rcx,[rsp+20]
       mov       edx,esi
       call      qword ptr [7FFE2CF071B0]; System.HashCode.Add(Int32)
       lea       rcx,[rsp+20]
       mov       edx,esi
       call      qword ptr [7FFE2CF071B0]; System.HashCode.Add(Int32)
       lea       rcx,[rsp+20]
       mov       edx,esi
       call      qword ptr [7FFE2CF071B0]; System.HashCode.Add(Int32)
       lea       rcx,[rsp+20]
       mov       edx,esi
       call      qword ptr [7FFE2CF071B0]; System.HashCode.Add(Int32)
       lea       rcx,[rsp+20]
       mov       edx,esi
       call      qword ptr [7FFE2CF071B0]; System.HashCode.Add(Int32)
       lea       rcx,[rsp+20]
       mov       edx,esi
       call      qword ptr [7FFE2CF071B0]; System.HashCode.Add(Int32)
       lea       rcx,[rsp+20]
       mov       edx,esi
       call      qword ptr [7FFE2CF071B0]; System.HashCode.Add(Int32)
       inc       esi
       cmp       esi,64
       jl        short M00_L00
       lea       rcx,[rsp+20]
       call      qword ptr [7FFE2CF071C8]; System.HashCode.ToHashCode()
       nop
       add       rsp,40
       pop       rsi
       ret
; Total bytes of code 165
; System.HashCode.Add(Int32)
       mov       eax,[rcx+1C]
       lea       r8d,[rax+1]
       mov       [rcx+1C],r8d
       mov       r8d,eax
       and       r8d,3
       je        short M01_L01
       cmp       r8d,1
       je        short M01_L00
       cmp       r8d,2
       jne       short M01_L03
       jmp       short M01_L02
M01_L00:
       mov       [rcx+14],edx
       ret
M01_L01:
       mov       [rcx+10],edx
       ret
M01_L02:
       mov       [rcx+18],edx
       ret
M01_L03:
       cmp       eax,3
       jne       short M01_L04
       lea       rax,[rcx+4]
       lea       r8,[rcx+8]
       lea       r9,[rcx+0C]
       mov       dword ptr [rcx],0DB4532AD
       mov       dword ptr [rax],3D0DB8FC
       mov       dword ptr [r8],0B721EE85
       mov       dword ptr [r9],18EA74D4
M01_L04:
       mov       eax,[rcx]
       imul      r8d,[rcx+10],85EBCA77
       add       eax,r8d
       rol       eax,0D
       imul      eax,9E3779B1
       mov       [rcx],eax
       mov       eax,[rcx+4]
       imul      r8d,[rcx+14],85EBCA77
       add       eax,r8d
       rol       eax,0D
       imul      eax,9E3779B1
       mov       [rcx+4],eax
       mov       eax,[rcx+8]
       imul      r8d,[rcx+18],85EBCA77
       add       eax,r8d
       rol       eax,0D
       imul      eax,9E3779B1
       mov       [rcx+8],eax
       imul      edx,85EBCA77
       add       edx,[rcx+0C]
       rol       edx,0D
       imul      eax,edx,9E3779B1
       mov       [rcx+0C],eax
       ret
; Total bytes of code 187
; System.HashCode.ToHashCode()
       mov       eax,[rcx+1C]
       mov       edx,eax
       and       edx,3
       cmp       eax,4
       jb        short M02_L02
       mov       r8d,[rcx]
       mov       r9d,[rcx+4]
       mov       r10d,[rcx+8]
       mov       r11d,[rcx+0C]
       rol       r8d,1
       rol       r9d,7
       add       r8d,r9d
       rol       r10d,0C
       add       r8d,r10d
       rol       r11d,12
       add       r8d,r11d
M02_L00:
       lea       eax,[r8+rax*4]
       test      edx,edx
       je        short M02_L01
       imul      r8d,[rcx+10],0C2B2AE3D
       add       eax,r8d
       rol       eax,11
       imul      eax,27D4EB2F
       cmp       edx,1
       ja        short M02_L03
M02_L01:
       mov       edx,eax
       shr       edx,0F
       xor       eax,edx
       imul      eax,85EBCA77
       mov       edx,eax
       shr       edx,0D
       xor       eax,edx
       imul      eax,0C2B2AE3D
       mov       edx,eax
       shr       edx,10
       xor       eax,edx
       ret
M02_L02:
       mov       r8d,0CD785636
       jmp       short M02_L00
M02_L03:
       imul      r8d,[rcx+14],0C2B2AE3D
       add       r8d,eax
       rol       r8d,11
       imul      eax,r8d,27D4EB2F
       cmp       edx,2
       jbe       short M02_L01
       imul      edx,[rcx+18],0C2B2AE3D
       add       edx,eax
       rol       edx,11
       imul      eax,edx,27D4EB2F
       jmp       short M02_L01
; Total bytes of code 174

Compare Jit Disasm

; System.Tests.Perf_HashCode.Add()
       push      rsi
       sub       rsp,40
       vxorps    xmm4,xmm4,xmm4
       vmovdqa   xmmword ptr [rsp+20],xmm4
       vmovdqa   xmmword ptr [rsp+30],xmm4
       xor       esi,esi
M00_L00:
       lea       rcx,[rsp+20]
       mov       edx,esi
       call      qword ptr [7FF7D0C391B0]; System.HashCode.Add(Int32)
       lea       rcx,[rsp+20]
       mov       edx,esi
       call      qword ptr [7FF7D0C391B0]; System.HashCode.Add(Int32)
       lea       rcx,[rsp+20]
       mov       edx,esi
       call      qword ptr [7FF7D0C391B0]; System.HashCode.Add(Int32)
       lea       rcx,[rsp+20]
       mov       edx,esi
       call      qword ptr [7FF7D0C391B0]; System.HashCode.Add(Int32)
       lea       rcx,[rsp+20]
       mov       edx,esi
       call      qword ptr [7FF7D0C391B0]; System.HashCode.Add(Int32)
       lea       rcx,[rsp+20]
       mov       edx,esi
       call      qword ptr [7FF7D0C391B0]; System.HashCode.Add(Int32)
       lea       rcx,[rsp+20]
       mov       edx,esi
       call      qword ptr [7FF7D0C391B0]; System.HashCode.Add(Int32)
       lea       rcx,[rsp+20]
       mov       edx,esi
       call      qword ptr [7FF7D0C391B0]; System.HashCode.Add(Int32)
       lea       rcx,[rsp+20]
       mov       edx,esi
       call      qword ptr [7FF7D0C391B0]; System.HashCode.Add(Int32)
       inc       esi
       cmp       esi,64
       jl        short M00_L00
       lea       rcx,[rsp+20]
       call      qword ptr [7FF7D0C391C8]; System.HashCode.ToHashCode()
       nop
       add       rsp,40
       pop       rsi
       ret
; Total bytes of code 165
; System.HashCode.Add(Int32)
       mov       eax,[rcx+1C]
       lea       r8d,[rax+1]
       mov       [rcx+1C],r8d
       mov       r8d,eax
       and       r8d,3
       je        short M01_L01
       cmp       r8d,1
       je        short M01_L00
       cmp       r8d,2
       jne       short M01_L03
       jmp       short M01_L02
M01_L00:
       mov       [rcx+14],edx
       ret
M01_L01:
       mov       [rcx+10],edx
       ret
M01_L02:
       mov       [rcx+18],edx
       ret
M01_L03:
       cmp       eax,3
       jne       short M01_L04
       lea       rax,[rcx+4]
       lea       r8,[rcx+8]
       lea       r9,[rcx+0C]
       mov       dword ptr [rcx],522AE901
       mov       dword ptr [rax],0B3F36F50
       mov       dword ptr [r8],2E07A4D9
       mov       dword ptr [r9],8FD02B28
M01_L04:
       mov       eax,[rcx]
       imul      r8d,[rcx+10],85EBCA77
       add       eax,r8d
       rol       eax,0D
       imul      eax,9E3779B1
       mov       [rcx],eax
       mov       eax,[rcx+4]
       imul      r8d,[rcx+14],85EBCA77
       add       eax,r8d
       rol       eax,0D
       imul      eax,9E3779B1
       mov       [rcx+4],eax
       mov       eax,[rcx+8]
       imul      r8d,[rcx+18],85EBCA77
       add       eax,r8d
       rol       eax,0D
       imul      eax,9E3779B1
       mov       [rcx+8],eax
       imul      edx,85EBCA77
       add       edx,[rcx+0C]
       rol       edx,0D
       imul      eax,edx,9E3779B1
       mov       [rcx+0C],eax
       ret
; Total bytes of code 187
; System.HashCode.ToHashCode()
       mov       eax,[rcx+1C]
       mov       edx,eax
       and       edx,3
       cmp       eax,4
       jb        short M02_L02
       mov       r8d,[rcx]
       mov       r9d,[rcx+4]
       mov       r10d,[rcx+8]
       mov       r11d,[rcx+0C]
       rol       r8d,1
       rol       r9d,7
       add       r8d,r9d
       rol       r10d,0C
       add       r8d,r10d
       rol       r11d,12
       add       r8d,r11d
M02_L00:
       lea       eax,[r8+rax*4]
       test      edx,edx
       je        short M02_L01
       imul      r8d,[rcx+10],0C2B2AE3D
       add       eax,r8d
       rol       eax,11
       imul      eax,27D4EB2F
       cmp       edx,1
       ja        short M02_L03
M02_L01:
       mov       edx,eax
       shr       edx,0F
       xor       eax,edx
       imul      eax,85EBCA77
       mov       edx,eax
       shr       edx,0D
       xor       eax,edx
       imul      eax,0C2B2AE3D
       mov       edx,eax
       shr       edx,10
       xor       eax,edx
       ret
M02_L02:
       mov       r8d,445E0C8A
       jmp       short M02_L00
M02_L03:
       imul      r8d,[rcx+14],0C2B2AE3D
       add       r8d,eax
       rol       r8d,11
       imul      eax,r8d,27D4EB2F
       cmp       edx,2
       jbe       short M02_L01
       imul      edx,[rcx+18],0C2B2AE3D
       add       edx,eax
       rol       edx,11
       imul      eax,edx,27D4EB2F
       jmp       short M02_L01
; Total bytes of code 174

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

@performanceautofiler
Copy link
Author

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Memory.Span<Byte>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
IndexOfAnyThreeValues - Duration of single invocation 4.31 ns 6.69 ns 1.55 0.29 False
IndexOfAnyTwoValues - Duration of single invocation 9.33 ns 12.06 ns 1.29 0.12 False
IndexOfValue - Duration of single invocation 7.81 ns 10.14 ns 1.30 0.08 False

graph
graph
graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Memory.Span&lt;Byte&gt;*'

Payloads

Baseline
Compare

Histogram

System.Memory.Span<Byte>.IndexOfAnyThreeValues(Size: 33)


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 6.688401220331571 > 4.52985451911958.
IsChangePoint: Marked as a change because one of 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -10.015251719308925 (T) = (0 -5.2759171980532145) / Math.Sqrt((0.04174260868664971 / (14)) + (0.17256315135999023 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.2077457729310386 = (4.368400466638988 - 5.2759171980532145) / 4.368400466638988 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Byte&gt;.IndexOfAnyTwoValues(Size: 512)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 12.063570521259576 > 9.947021985001589.
IsChangePoint: Marked as a change because one of 12/1/2022 11:48:13 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -60.11481624230292 (T) = (0 -11.923158120052507) / Math.Sqrt((0.0039112758617871534 / (14)) + (0.045440894065887555 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.2581721885519771 = (9.476571035777543 - 11.923158120052507) / 9.476571035777543 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Byte&gt;.IndexOfValue(Size: 512)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 10.143601132280713 > 8.118807718793475.
IsChangePoint: Marked as a change because one of 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -126.69726735711315 (T) = (0 -10.129929934999833) / Math.Sqrt((0.0045761415398686825 / (14)) + (0.0009524343613679088 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.30872219100193726 = (7.740321058699644 - 10.129929934999833) / 7.740321058699644 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

### Run Information
Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int64>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
GetHashCodeBenchmark - Duration of single invocation 7.80 ns 9.09 ns 1.16 0.11 False

graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Runtime.Intrinsics.Tests.Perf_Vector128Of&lt;Int64&gt;*'

Payloads

Baseline
Compare

Histogram

System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int64>.GetHashCodeBenchmark


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 9.088575117498955 > 8.221043523702631.
IsChangePoint: Marked as a change because one of 11/11/2022 5:53:56 PM, 12/6/2022 2:12:43 AM, 12/14/2022 5:20:21 PM, 12/17/2022 10:44:50 PM, 12/20/2022 1:34:12 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -18.166708574363714 (T) = (0 -9.012729890015617) / Math.Sqrt((0.0013641789937194225 / (14)) + (0.13176293026217614 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.147990371450672 = (7.850875855889428 - 9.012729890015617) / 7.850875855889428 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in LinqBenchmarks

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
Count00LinqMethodX - Duration of single invocation 1.02 secs 1.09 secs 1.07 0.04 False Trace Trace

graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'LinqBenchmarks*'

Payloads

Baseline
Compare

Histogram

LinqBenchmarks.Count00LinqMethodX


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 1.08979118 > 1.0725810980000001.
IsChangePoint: Marked as a change because one of 11/22/2022 2:20:42 AM, 12/6/2022 5:44:36 AM, 12/20/2022 1:34:12 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -11.56012139674312 (T) = (0 -1084387090.5605507) / Math.Sqrt((59499099027679.37 / (14)) + (768208390234352.5 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.059247574658092536 = (1023733371.219257 - 1084387090.5605507) / 1023733371.219257 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; BenchmarkDotNet.Autogenerated.Runnable_0.__ForDisassemblyDiagnoser__()
       push      rbp
       sub       rsp,20
       lea       rbp,[rsp+20]
       mov       [rbp+10],rcx
       mov       rcx,[rbp+10]
       cmp       dword ptr [rcx+40],0B
       jne       short M00_L00
       mov       rcx,[rbp+10]
       call      qword ptr [7FFCEDA13708]
       nop
       add       rsp,20
       pop       rbp
       ret
M00_L00:
       xor       eax,eax
       add       rsp,20
       pop       rbp
       ret
; Total bytes of code 49

Compare Jit Disasm

; BenchmarkDotNet.Autogenerated.Runnable_0.__ForDisassemblyDiagnoser__()
       push      rbp
       sub       rsp,20
       lea       rbp,[rsp+20]
       mov       [rbp+10],rcx
       mov       rcx,[rbp+10]
       cmp       dword ptr [rcx+40],0B
       jne       short M00_L00
       mov       rcx,[rbp+10]
       call      qword ptr [7FF8797EBB40]
       nop
       add       rsp,20
       pop       rbp
       ret
M00_L00:
       xor       eax,eax
       add       rsp,20
       pop       rbp
       ret
; Total bytes of code 49

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Memory.Span<Char>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
SequenceEqual - Duration of single invocation 21.30 ns 23.89 ns 1.12 0.06 False
IndexOfAnyThreeValues - Duration of single invocation 6.54 ns 8.36 ns 1.28 0.21 False
IndexOfAnyThreeValues - Duration of single invocation 4.21 ns 5.62 ns 1.33 0.23 False
IndexOfAnyTwoValues - Duration of single invocation 4.59 ns 6.86 ns 1.49 0.18 False
IndexOfAnyTwoValues - Duration of single invocation 18.52 ns 21.25 ns 1.15 0.10 False
IndexOfValue - Duration of single invocation 14.56 ns 17.32 ns 1.19 0.05 False
IndexOfValue - Duration of single invocation 2.53 ns 4.50 ns 1.78 0.11 False
IndexOfAnyTwoValues - Duration of single invocation 3.05 ns 4.11 ns 1.34 0.13 False
SequenceEqual - Duration of single invocation 3.74 ns 4.76 ns 1.27 0.17 False

graph
graph
graph
graph
graph
graph
graph
graph
graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Memory.Span&lt;Char&gt;*'

Payloads

Baseline
Compare

Histogram

System.Memory.Span<Char>.SequenceEqual(Size: 512)


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 23.89232426388415 > 22.81718387164758.
IsChangePoint: Marked as a change because one of 10/31/2022 10:23:25 PM, 11/11/2022 5:53:56 PM, 11/18/2022 8:48:12 PM, 12/12/2022 5:25:39 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -13.991794490003649 (T) = (0 -23.49421288545805) / Math.Sqrt((0.06742729453116522 / (14)) + (0.4352512651219854 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.08685367741942551 = (21.61672115904471 - 23.49421288545805) / 21.61672115904471 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Char&gt;.IndexOfAnyThreeValues(Size: 33)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 8.362037039485658 > 6.887225383417874.
IsChangePoint: Marked as a change because one of 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -16.232757765556215 (T) = (0 -8.420345449779816) / Math.Sqrt((0.11809462645233709 / (14)) + (0.0942116987273042 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.2576078113498619 = (6.695525722555573 - 8.420345449779816) / 6.695525722555573 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Char&gt;.IndexOfAnyThreeValues(Size: 4)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 5.61694936385416 > 4.420162372928747.
IsChangePoint: Marked as a change because one of 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -21.82780545291282 (T) = (0 -5.737344761334258) / Math.Sqrt((0.026766220908033142 / (14)) + (0.0778907113497045 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.330974487819211 = (4.310634661927174 - 5.737344761334258) / 4.310634661927174 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Char&gt;.IndexOfAnyTwoValues(Size: 33)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 6.856226941170559 > 4.82911508443263.
IsChangePoint: Marked as a change because one of 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -18.05800793214548 (T) = (0 -6.391478865035926) / Math.Sqrt((0.11956572146488756 / (14)) + (0.0076965617780046505 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.3598813616736624 = (4.700026814963967 - 6.391478865035926) / 4.700026814963967 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Char&gt;.IndexOfAnyTwoValues(Size: 512)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 21.254483014663837 > 19.477601929274524.
IsChangePoint: Marked as a change because one of 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -43.540255422241586 (T) = (0 -21.733506099046902) / Math.Sqrt((0.05404952535933209 / (14)) + (0.03794709985847532 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.16524262434501763 = (18.651485660562148 - 21.733506099046902) / 18.651485660562148 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Char&gt;.IndexOfValue(Size: 512)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 17.324904427767446 > 15.280021847021812.
IsChangePoint: Marked as a change because one of 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -23.52948767848823 (T) = (0 -17.203725082208116) / Math.Sqrt((0.11032984326763888 / (14)) + (0.09621700605609833 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.16565248259128587 = (14.758879974212931 - 17.203725082208116) / 14.758879974212931 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Char&gt;.IndexOfValue(Size: 4)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 4.497107310649779 > 2.658433388491175.
IsChangePoint: Marked as a change because one of 12/17/2022 10:44:50 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -8.845105388192739 (T) = (0 -3.0548220918007596) / Math.Sqrt((0.0008594913925675681 / (14)) + (0.1091590999062429 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.2020203534956602 = (2.541406293925778 - 3.0548220918007596) / 2.541406293925778 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Char&gt;.IndexOfAnyTwoValues(Size: 4)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 4.106750152298499 > 3.1934732800910295.
IsChangePoint: Marked as a change because one of 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -37.11897981020811 (T) = (0 -4.134283669955344) / Math.Sqrt((1.0907724841934129E-05 / (14)) + (0.0285397092664857 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.3589821466802544 = (3.0421913047604376 - 4.134283669955344) / 3.0421913047604376 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Char&gt;.SequenceEqual(Size: 33)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 4.76043246787451 > 3.9542257437301447.
IsChangePoint: Marked as a change because one of 12/12/2022 5:25:39 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -17.985021526133206 (T) = (0 -4.7092082511176905) / Math.Sqrt((0.0014354965136032087 / (14)) + (0.08696391246476293 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.24973707336960635 = (3.768159200415234 - 4.7092082511176905) / 3.768159200415234 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int32>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
GetHashCodeBenchmark - Duration of single invocation 12.60 ns 14.13 ns 1.12 0.09 False

graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Runtime.Intrinsics.Tests.Perf_Vector128Of&lt;Int32&gt;*'

Payloads

Baseline
Compare

Histogram

System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int32>.GetHashCodeBenchmark


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 14.129748038558466 > 13.231823582219246.
IsChangePoint: Marked as a change because one of 12/6/2022 2:12:43 AM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -17.5421597708763 (T) = (0 -13.953315517531479) / Math.Sqrt((0.0007508339815934227 / (14)) + (0.18982217855452999 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.10594241781515715 = (12.616674514661378 - 13.953315517531479) / 12.616674514661378 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Collections.TryGetValueFalse<Int32, Int32>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
ImmutableDictionary - Duration of single invocation 23.97 μs 26.60 μs 1.11 0.07 False

graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Collections.TryGetValueFalse&lt;Int32, Int32&gt;*'

Payloads

Baseline
Compare

Histogram

System.Collections.TryGetValueFalse<Int32, Int32>.ImmutableDictionary(Size: 512)


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 26.602725014196476 > 25.20092583675487.
IsChangePoint: Marked as a change because one of 10/19/2022 7:27:15 PM, 10/31/2022 10:23:25 PM, 11/11/2022 5:53:56 PM, 11/18/2022 8:48:12 PM, 12/12/2022 5:25:39 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -17.27289189177557 (T) = (0 -26334.551609400216) / Math.Sqrt((15031.363142633976 / (14)) + (537092.5032272752 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.09456261036381065 = (24059.429182079533 - 26334.551609400216) / 24059.429182079533 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in Benchstone.BenchI.IniArray

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
Test - Duration of single invocation 57.78 ms 63.02 ms 1.09 0.04 False Trace Trace

graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'Benchstone.BenchI.IniArray*'

Payloads

Baseline
Compare

Histogram

Benchstone.BenchI.IniArray.Test


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 63.02217 > 61.73762866586539.
IsChangePoint: Marked as a change because one of 11/11/2022 5:53:56 PM, 11/18/2022 8:48:12 PM, 12/6/2022 2:12:43 AM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -9.167619634377756 (T) = (0 -63346853.40909091) / Math.Sqrt((1321517723366.2288 / (14)) + (3336008237706.081 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.06836069561772556 = (59293507.95937302 - 63346853.40909091) / 59293507.95937302 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; Benchstone.BenchI.IniArray.Test()
       sub       rsp,28
       mov       rcx,offset MT_System.Char[]
       mov       edx,10
       call      CORINFO_HELP_NEWARR_1_VC
       xor       edx,edx
M00_L00:
       xor       ecx,ecx
       nop       dword ptr [rax]
M00_L01:
       mov       r8d,ecx
       mov       word ptr [rax+r8*2+10],20
       inc       ecx
       cmp       ecx,10
       jl        short M00_L01
       inc       edx
       cmp       edx,989680
       jl        short M00_L00
       add       rsp,28
       ret
; Total bytes of code 65

Compare Jit Disasm

; Benchstone.BenchI.IniArray.Test()
       sub       rsp,28
       mov       rcx,offset MT_System.Char[]
       mov       edx,10
       call      CORINFO_HELP_NEWARR_1_VC
       xor       edx,edx
M00_L00:
       xor       ecx,ecx
       nop       dword ptr [rax]
M00_L01:
       mov       r8d,ecx
       mov       word ptr [rax+r8*2+10],20
       inc       ecx
       cmp       ecx,10
       jl        short M00_L01
       inc       edx
       cmp       edx,989680
       jl        short M00_L00
       add       rsp,28
       ret
; Total bytes of code 65

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in PerfLabTests.CastingPerf2.CastingPerf

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
FooObjIsNull - Duration of single invocation 375.86 μs 497.29 μs 1.32 0.04 False Trace Trace

graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'PerfLabTests.CastingPerf2.CastingPerf*'

Payloads

Baseline
Compare

Histogram

PerfLabTests.CastingPerf2.CastingPerf.FooObjIsNull


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 497.2916536458333 > 393.79546744791674.
IsChangePoint: Marked as a change because one of 11/18/2022 8:48:12 PM, 12/3/2022 7:24:45 AM, 12/10/2022 11:25:25 PM, 12/28/2022 5:13:50 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -14.635591631671064 (T) = (0 -507673.4125515069) / Math.Sqrt((641509.0878382667 / (14)) + (2712995160.784904 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.35403289351135164 = (374934.3276550547 - 507673.4125515069) / 374934.3276550547 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; PerfLabTests.CastingPerf2.CastingPerf.FooObjIsNull()
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       xor       esi,esi
       mov       edi,[7FF7A7BC4CF0]
       test      edi,edi
       jle       short M00_L01
       mov       rdx,1F90D4064D0
       mov       rbx,[rdx]
       mov       rbp,1F90D4064E0
M00_L00:
       mov       rcx,rbp
       mov       rdx,rbx
       call      CORINFO_HELP_ASSIGN_REF
       inc       esi
       cmp       esi,edi
       jl        short M00_L00
M00_L01:
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       ret
; Total bytes of code 61

Compare Jit Disasm

; PerfLabTests.CastingPerf2.CastingPerf.FooObjIsNull()
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       xor       esi,esi
       mov       edi,[7FFC503929B8]
       test      edi,edi
       jle       short M00_L01
       mov       rdx,131664064D0
       mov       rbx,[rdx]
       mov       rbp,131664064E0
M00_L00:
       mov       rcx,rbp
       mov       rdx,rbx
       call      CORINFO_HELP_ASSIGN_REF
       inc       esi
       cmp       esi,edi
       jl        short M00_L00
M00_L01:
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       ret
; Total bytes of code 61

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

@performanceautofiler
Copy link
Author

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in Microsoft.Extensions.Primitives.StringSegmentBenchmark

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
IndexOfAny - Duration of single invocation 6.79 ns 8.14 ns 1.20 0.05 False 90.6044626150156 109.59676837810011 1.2096177739476706 Trace Trace
IndexOf - Duration of single invocation 4.03 ns 5.94 ns 1.47 0.03 False 69.72380677253331 67.67989115692451 0.9706855418511949 Trace Trace

graph
graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'Microsoft.Extensions.Primitives.StringSegmentBenchmark*'

Payloads

Baseline
Compare

Histogram

Microsoft.Extensions.Primitives.StringSegmentBenchmark.IndexOfAny


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 8.141592639882667 > 7.103631515435954.
IsChangePoint: Marked as a change because one of 11/4/2022 4:27:34 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -60.35943057253968 (T) = (0 -8.138337026326202) / Math.Sqrt((5.3581953463393844E-05 / (14)) + (0.016896701545868902 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.2025732555281851 = (6.76743557110934 - 8.138337026326202) / 6.76743557110934 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; Microsoft.Extensions.Primitives.StringSegmentBenchmark.IndexOfAny()
       push      rsi
       sub       rsp,20
       lea       rsi,[rcx+38]
       mov       rdx,[rcx+10]
       mov       eax,0FFFFFFFF
       mov       rcx,[rsi]
       test      rcx,rcx
       je        short M00_L00
       mov       r8d,[rsi+0C]
       test      r8d,r8d
       je        short M00_L01
       dec       r8d
       cmp       r8d,7
       jb        short M00_L02
       mov       r8d,[rsi+8]
       inc       r8d
       mov       r9d,7
       cmp       [rcx],ecx
       call      qword ptr [7FF9AB395660]; System.String.IndexOfAny(Char[], Int32, Int32)
       cmp       eax,0FFFFFFFF
       je        short M00_L00
       sub       eax,[rsi+8]
M00_L00:
       add       rsp,20
       pop       rsi
       ret
M00_L01:
       mov       ecx,4
       call      qword ptr [7FF9ABD17018]
       int       3
M00_L02:
       mov       ecx,5
       call      qword ptr [7FF9ABD17018]
       int       3
; Total bytes of code 103
; System.String.IndexOfAny(Char[], Int32, Int32)
       push      rsi
       sub       rsp,40
       mov       esi,r8d
M01_L00:
       test      rdx,rdx
       je        near ptr M01_L04
       mov       r8d,[rcx+8]
       cmp       r8d,esi
       jb        near ptr M01_L05
       sub       r8d,esi
       cmp       r8d,r9d
       jb        near ptr M01_L06
       movsxd    r8,esi
       lea       rcx,[rcx+r8*2+0C]
       lea       r8,[rdx+10]
       mov       edx,[rdx+8]
       mov       [rsp+3C],edx
       cmp       edx,5
       ja        near ptr M01_L01
       mov       edx,[rsp+3C]
       lea       rax,[7FF9AB3D3A00]
       mov       eax,[rax+rdx*4]
       lea       r10,[M01_L00]
       add       rax,r10
       jmp       rax
       mov       eax,0FFFFFFFF
       jmp       near ptr M01_L02
       movsx     rdx,word ptr [r8]
       mov       r8d,r9d
       call      qword ptr [7FF9AB9316A8]; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       jmp       near ptr M01_L02
       movsx     rdx,word ptr [r8]
       movsx     r8,word ptr [r8+2]
       call      qword ptr [7FF9ABAEB930]; System.SpanHelpers.IndexOfAnyValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int16, Int32)
       jmp       near ptr M01_L02
       movsx     rdx,word ptr [r8]
       movsx     rax,word ptr [r8+2]
       movsx     r10,word ptr [r8+4]
       mov       [rsp+20],r9d
       mov       r8d,eax
       mov       r9d,r10d
       call      qword ptr [7FF9ABBBD7E0]; System.SpanHelpers.IndexOfAnyValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int16, Int16, Int32)
       jmp       short M01_L02
       movsx     rdx,word ptr [r8]
       movsx     rax,word ptr [r8+2]
       movsx     r10,word ptr [r8+4]
       movsx     r8,word ptr [r8+6]
       mov       [rsp+20],r8d
       mov       [rsp+28],r9d
       mov       r8d,eax
       mov       r9d,r10d
       call      qword ptr [7FF9ABD41EE8]
       jmp       short M01_L02
       movsx     rdx,word ptr [r8]
       movsx     rax,word ptr [r8+2]
       movsx     r10,word ptr [r8+4]
       movsx     r11,word ptr [r8+6]
       movsx     r8,word ptr [r8+8]
       mov       [rsp+20],r11d
       mov       [rsp+28],r8d
       mov       [rsp+30],r9d
       mov       r8d,eax
       mov       r9d,r10d
       call      qword ptr [7FF9ABD43720]
       jmp       short M01_L02
M01_L01:
       mov       edx,r9d
       mov       r9d,[rsp+3C]
       call      qword ptr [7FF9ABD43F90]
M01_L02:
       test      eax,eax
       jge       short M01_L03
       add       rsp,40
       pop       rsi
       ret
M01_L03:
       add       eax,esi
       add       rsp,40
       pop       rsi
       ret
M01_L04:
       mov       ecx,60
       call      qword ptr [7FF9ABAE37F8]
       int       3
M01_L05:
       mov       ecx,8
       xor       edx,edx
       call      qword ptr [7FF9ABAE3840]
       int       3
M01_L06:
       mov       ecx,1B
       mov       edx,4
       call      qword ptr [7FF9ABAE3840]
       int       3
; Total bytes of code 348

Compare Jit Disasm

; Microsoft.Extensions.Primitives.StringSegmentBenchmark.IndexOfAny()
       push      rsi
       sub       rsp,20
       lea       rsi,[rcx+38]
       mov       rdx,[rcx+10]
       mov       eax,0FFFFFFFF
       mov       rcx,[rsi]
       test      rcx,rcx
       je        short M00_L00
       mov       r8d,[rsi+0C]
       test      r8d,r8d
       je        short M00_L01
       dec       r8d
       cmp       r8d,7
       jb        short M00_L02
       mov       r8d,[rsi+8]
       inc       r8d
       mov       r9d,7
       cmp       [rcx],ecx
       call      qword ptr [7FFCF2F45660]; System.String.IndexOfAny(Char[], Int32, Int32)
       cmp       eax,0FFFFFFFF
       je        short M00_L00
       sub       eax,[rsi+8]
M00_L00:
       add       rsp,20
       pop       rsi
       ret
M00_L01:
       mov       ecx,4
       call      qword ptr [7FFCF38B7018]
       int       3
M00_L02:
       mov       ecx,5
       call      qword ptr [7FFCF38B7018]
       int       3
; Total bytes of code 103
; System.String.IndexOfAny(Char[], Int32, Int32)
       push      rdi
       push      rsi
       push      rbx
       sub       rsp,50
       mov       esi,r8d
M01_L00:
       test      rdx,rdx
       je        near ptr M01_L10
       cmp       [rcx+8],esi
       jb        near ptr M01_L11
       mov       r8d,[rcx+8]
       sub       r8d,esi
       cmp       r8d,r9d
       jb        near ptr M01_L12
       movsxd    r8,esi
       lea       rcx,[rcx+r8*2+0C]
       lea       r8,[rdx+10]
       mov       edx,[rdx+8]
       mov       eax,r9d
       mov       r9d,edx
       cmp       r9d,5
       ja        near ptr M01_L07
       mov       edx,r9d
       lea       r9,[7FFCF2F85E98]
       mov       r9d,[r9+rdx*4]
       lea       r10,[M01_L00]
       add       r9,r10
       jmp       r9
       mov       eax,0FFFFFFFF
       jmp       near ptr M01_L08
       movsx     rdx,word ptr [r8]
       movsx     rdx,dx
       mov       [rsp+4C],edx
       movzx     edi,word ptr [rsp+4C]
       lea       edx,[rdi-1]
       cmp       edx,0FE
       jae       short M01_L01
       movsx     rdx,di
       mov       r8d,eax
       call      qword ptr [7FFCF34E58E8]
       jmp       short M01_L02
M01_L01:
       mov       edx,[rsp+4C]
       mov       r8d,eax
       call      qword ptr [7FFCF387DB58]; System.SpanHelpers.NonPackedIndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
M01_L02:
       jmp       near ptr M01_L08
       movsx     rdx,word ptr [r8]
       movsx     r8,word ptr [r8+2]
       mov       r9d,eax
       movsx     rdx,dx
       mov       [rsp+48],edx
       movsx     r8,r8w
       mov       [rsp+44],r8d
       movzx     edi,word ptr [rsp+48]
       lea       r8d,[rdi-1]
       cmp       r8d,0FE
       jae       short M01_L03
       movzx     ebx,word ptr [rsp+44]
       lea       r8d,[rbx-1]
       cmp       r8d,0FE
       jae       short M01_L03
       mov       edx,edi
       movsx     r8,bx
       movsx     rdx,dx
       call      qword ptr [7FFCF36B5E28]; System.PackedSpanHelpers.IndexOfAny[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int16, Int32)
       jmp       short M01_L04
M01_L03:
       mov       edx,[rsp+48]
       mov       r8d,[rsp+44]
       call      qword ptr [7FFCF38F3ED0]
M01_L04:
       jmp       near ptr M01_L08
       movsx     r9,word ptr [r8]
       movsx     rdx,word ptr [r8+2]
       movsx     r8,word ptr [r8+4]
       movsx     r9,r9w
       mov       [rsp+40],r9d
       movsx     r9,dx
       mov       [rsp+3C],r9d
       movsx     r9,r8w
       mov       [rsp+38],r9d
       movzx     edi,word ptr [rsp+40]
       lea       r9d,[rdi-1]
       cmp       r9d,0FE
       jae       short M01_L05
       movzx     ebx,word ptr [rsp+3C]
       lea       r9d,[rbx-1]
       cmp       r9d,0FE
       jae       short M01_L05
       movzx     r9d,word ptr [rsp+38]
       lea       edx,[r9-1]
       cmp       edx,0FE
       jae       short M01_L05
       mov       edx,edi
       mov       r8d,ebx
       mov       [rsp+20],eax
       movsx     r9,r9w
       movsx     rdx,dx
       movsx     r8,r8w
       call      qword ptr [7FFCF3775B28]
       jmp       short M01_L06
M01_L05:
       mov       [rsp+20],eax
       mov       edx,[rsp+40]
       mov       r8d,[rsp+3C]
       mov       r9d,[rsp+38]
       call      qword ptr [7FFCF38F5E40]
M01_L06:
       jmp       short M01_L08
       movsx     rdx,word ptr [r8]
       movsx     r9,word ptr [r8+2]
       movsx     r10,word ptr [r8+4]
       movsx     r8,word ptr [r8+6]
       mov       [rsp+20],r8d
       mov       [rsp+28],eax
       mov       r8d,r9d
       mov       r9d,r10d
       call      qword ptr [7FFCF38F7618]
       jmp       short M01_L08
       movsx     rdx,word ptr [r8]
       movsx     r9,word ptr [r8+2]
       movsx     r10,word ptr [r8+4]
       movsx     r11,word ptr [r8+6]
       movsx     r8,word ptr [r8+8]
       mov       [rsp+20],r11d
       mov       [rsp+28],r8d
       mov       [rsp+30],eax
       mov       r8d,r9d
       mov       r9d,r10d
       call      qword ptr [7FFCF38F7DF8]
       jmp       short M01_L08
M01_L07:
       mov       edx,eax
       call      qword ptr [7FFCF38F9708]
M01_L08:
       test      eax,eax
       jge       short M01_L09
       add       rsp,50
       pop       rbx
       pop       rsi
       pop       rdi
       ret
M01_L09:
       add       eax,esi
       add       rsp,50
       pop       rbx
       pop       rsi
       pop       rdi
       ret
M01_L10:
       mov       ecx,60
       call      qword ptr [7FFCF3463378]
       int       3
M01_L11:
       mov       ecx,8
       xor       edx,edx
       call      qword ptr [7FFCF34633C0]
       int       3
M01_L12:
       mov       ecx,1B
       mov       edx,4
       call      qword ptr [7FFCF34633C0]
       int       3
; Total bytes of code 593

Microsoft.Extensions.Primitives.StringSegmentBenchmark.IndexOf


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 5.941599996860388 > 4.2354669408050105.
IsChangePoint: Marked as a change because one of 10/25/2022 2:34:53 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -82.8391960488371 (T) = (0 -5.880832532147385) / Math.Sqrt((3.0369285908006302E-05 / (14)) + (0.01634542094563601 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.45812166502067553 = (4.033156267562897 - 5.880832532147385) / 4.033156267562897 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; Microsoft.Extensions.Primitives.StringSegmentBenchmark.IndexOf()
       sub       rsp,28
       add       rcx,38
       mov       eax,0FFFFFFFF
       mov       rdx,[rcx]
       test      rdx,rdx
       je        short M00_L00
       mov       r8d,[rcx+0C]
       test      r8d,r8d
       je        short M00_L01
       lea       eax,[r8-1]
       cmp       eax,7
       jb        short M00_L02
       cmp       r8d,8
       jb        short M00_L03
       mov       ecx,[rcx+8]
       inc       ecx
       mov       r8d,[rdx+8]
       mov       eax,ecx
       add       rax,7
       cmp       r8,rax
       jb        short M00_L04
       mov       ecx,ecx
       lea       rcx,[rdx+rcx*2+0C]
       mov       edx,20
       mov       r8d,7
       call      qword ptr [7FFC523316A8]; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       test      eax,eax
       jl        short M00_L00
       inc       eax
M00_L00:
       add       rsp,28
       ret
M00_L01:
       mov       ecx,4
       call      qword ptr [7FFC52717018]
       int       3
M00_L02:
       mov       ecx,5
       call      qword ptr [7FFC52717018]
       int       3
M00_L03:
       mov       edx,1
       mov       r8d,7
       mov       r9d,4
       call      qword ptr [7FFC52513B28]
       int       3
M00_L04:
       mov       ecx,21
       call      qword ptr [7FFC524E3828]
       int       3
; Total bytes of code 160
; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       vzeroupper
       cmp       r8d,8
       jge       near ptr M01_L06
       xor       r9d,r9d
       cmp       r8d,4
       jl        short M01_L00
       add       r8d,0FFFFFFFC
       movsx     rax,word ptr [rcx+r9*2]
       movsx     r10,dx
       cmp       eax,r10d
       je        short M01_L05
       nop       dword ptr [rax]
       movsx     rax,word ptr [rcx+r9*2+2]
       cmp       eax,r10d
       je        short M01_L04
       movsx     rax,word ptr [rcx+r9*2+4]
       cmp       eax,r10d
       je        short M01_L03
       movsx     rax,word ptr [rcx+r9*2+6]
       cmp       eax,r10d
       je        short M01_L02
       add       r9,4
M01_L00:
       test      r8d,r8d
       jle       near ptr M01_L13
       movsx     r10,dx
       xchg      ax,ax
M01_L01:
       dec       r8d
       movsx     rax,word ptr [rcx+r9*2]
       cmp       eax,r10d
       je        short M01_L05
       inc       r9
       test      r8d,r8d
       jg        short M01_L01
       jmp       near ptr M01_L13
M01_L02:
       lea       eax,[r9+3]
       jmp       near ptr M01_L12
M01_L03:
       lea       eax,[r9+2]
       jmp       near ptr M01_L12
M01_L04:
       lea       eax,[r9+1]
       jmp       near ptr M01_L12
M01_L05:
       mov       eax,r9d
       jmp       near ptr M01_L12
M01_L06:
       cmp       r8d,10
       jl        near ptr M01_L09
       movsx     r10,dx
       vmovd     xmm0,r10d
       vpbroadcastw ymm0,xmm0
       mov       rax,rcx
       lea       edx,[r8-10]
       movsxd    r10,edx
       lea       r9,[rax+r10*2]
M01_L07:
       vpcmpeqw  ymm1,ymm0,[rax]
       vptest    ymm1,ymm1
       jne       short M01_L08
       add       rax,20
       cmp       rax,r9
       jbe       short M01_L07
       mov       eax,r8d
       test      al,0F
       je        near ptr M01_L13
       vpcmpeqw  ymm1,ymm0,[r9]
       vptest    ymm1,ymm1
       je        near ptr M01_L13
       sub       r9,rcx
       mov       rax,r9
       shr       rax,3F
       add       rax,r9
       sar       rax,1
       vmovupd   ymm0,[7FFC51DA2820]
       vpshufb   ymm1,ymm1,ymm0
       vpermq    ymm0,ymm1,0D8
       vpmovmskb ecx,xmm0
       xor       r8d,r8d
       tzcnt     r8d,ecx
       add       eax,r8d
       jmp       near ptr M01_L12
       nop       word ptr [rax+rax]
M01_L08:
       sub       rax,rcx
       mov       rcx,rax
       shr       rcx,3F
       add       rax,rcx
       sar       rax,1
       vmovupd   ymm0,[7FFC51DA2820]
       vpshufb   ymm0,ymm1,ymm0
       vpermq    ymm0,ymm0,0D8
       vpmovmskb edx,xmm0
       tzcnt     edx,edx
       add       eax,edx
       jmp       near ptr M01_L12
M01_L09:
       movsx     r10,dx
       vmovd     xmm0,r10d
       vpbroadcastw xmm0,xmm0
       mov       rax,rcx
       lea       edx,[r8-8]
       movsxd    r10,edx
       lea       rdx,[rax+r10*2]
M01_L10:
       vpcmpeqw  xmm1,xmm0,[rax]
       vptest    xmm1,xmm1
       jne       short M01_L11
       add       rax,10
       cmp       rax,rdx
       jbe       short M01_L10
       mov       eax,r8d
       test      al,7
       je        short M01_L13
       vpcmpeqw  xmm1,xmm0,[rdx]
       vptest    xmm1,xmm1
       je        short M01_L13
       sub       rdx,rcx
       mov       rax,rdx
       shr       rax,3F
       add       rax,rdx
       sar       rax,1
       vpshufb   xmm1,xmm1,[7FFC51DA2820]
       vpmovmskb ecx,xmm1
       xor       r8d,r8d
       tzcnt     r8d,ecx
       add       eax,r8d
       jmp       short M01_L12
M01_L11:
       sub       rax,rcx
       mov       rcx,rax
       shr       rcx,3F
       add       rax,rcx
       sar       rax,1
       vpshufb   xmm0,xmm1,[7FFC51DA2820]
       vpmovmskb edx,xmm0
       tzcnt     edx,edx
       add       eax,edx
M01_L12:
       vzeroupper
       ret
M01_L13:
       mov       eax,0FFFFFFFF
       vzeroupper
       ret
; Total bytes of code 512

Compare Jit Disasm

; Microsoft.Extensions.Primitives.StringSegmentBenchmark.IndexOf()
       sub       rsp,28
       add       rcx,38
       mov       eax,0FFFFFFFF
       mov       rdx,[rcx]
       test      rdx,rdx
       je        short M00_L00
       mov       r8d,[rcx+0C]
       test      r8d,r8d
       je        short M00_L01
       lea       eax,[r8-1]
       cmp       eax,7
       jb        short M00_L02
       cmp       r8d,8
       jb        short M00_L03
       mov       ecx,[rcx+8]
       inc       ecx
       mov       r8d,[rdx+8]
       mov       eax,ecx
       add       rax,7
       cmp       r8,rax
       jb        short M00_L04
       mov       ecx,ecx
       lea       rcx,[rdx+rcx*2+0C]
       mov       edx,20
       mov       r8d,7
       call      qword ptr [7FF9AB9458E8]; System.PackedSpanHelpers.IndexOf[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       test      eax,eax
       jl        short M00_L00
       inc       eax
M00_L00:
       add       rsp,28
       ret
M00_L01:
       mov       ecx,4
       call      qword ptr [7FF9ABD17018]
       int       3
M00_L02:
       mov       ecx,5
       call      qword ptr [7FF9ABD17018]
       int       3
M00_L03:
       mov       edx,1
       mov       r8d,7
       mov       r9d,4
       call      qword ptr [7FF9ABB1BF60]
       int       3
M00_L04:
       mov       ecx,21
       call      qword ptr [7FF9AB8C33A8]
       int       3
; Total bytes of code 160
; System.PackedSpanHelpers.IndexOf[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       vzeroupper
       cmp       r8d,8
       jge       near ptr M01_L07
       xor       r9d,r9d
       cmp       r8d,4
       jl        short M01_L04
       add       r8d,0FFFFFFFC
       movsx     rax,word ptr [rcx]
       movsx     r10,dx
       cmp       eax,r10d
       jne       short M01_L00
       xor       eax,eax
       vzeroupper
       ret
M01_L00:
       movsx     rax,word ptr [rcx+2]
       cmp       eax,r10d
       jne       short M01_L01
       mov       eax,1
       vzeroupper
       ret
M01_L01:
       movsx     rax,word ptr [rcx+4]
       cmp       eax,r10d
       jne       short M01_L02
       mov       eax,2
       vzeroupper
       ret
M01_L02:
       movsx     r9,word ptr [rcx+6]
       cmp       r9d,r10d
       jne       short M01_L03
       mov       eax,3
       jmp       near ptr M01_L19
       nop       word ptr [rax+rax]
M01_L03:
       mov       r9d,4
M01_L04:
       test      r8d,r8d
       jle       near ptr M01_L18
       movsx     r10,dx
M01_L05:
       dec       r8d
       movsx     rax,word ptr [rcx+r9*2]
       cmp       eax,r10d
       je        short M01_L06
       inc       r9
       test      r8d,r8d
       jg        short M01_L05
       jmp       near ptr M01_L18
       nop       dword ptr [rax]
M01_L06:
       mov       eax,r9d
       jmp       near ptr M01_L19
M01_L07:
       mov       rax,rcx
       cmp       r8d,10
       jle       near ptr M01_L14
       movzx     edx,dl
       vmovd     xmm0,edx
       vpbroadcastb ymm0,xmm0
       cmp       r8d,20
       jle       short M01_L09
       lea       r10d,[r8-20]
       movsxd    r9,r10d
       lea       rdx,[rax+r9*2]
M01_L08:
       vmovdqu   ymm1,ymmword ptr [rax]
       vpackuswb ymm1,ymm1,[rax+20]
       vpcmpeqb  ymm1,ymm0,ymm1
       vptest    ymm1,ymm1
       jne       short M01_L10
       add       rax,40
       cmp       rax,rdx
       jb        short M01_L08
M01_L09:
       add       r8d,0FFFFFFF0
       movsxd    rdx,r8d
       lea       rdx,[rcx+rdx*2]
       cmp       rax,rdx
       ja        short M01_L11
       mov       r8,rax
       jmp       short M01_L12
M01_L10:
       vpmovmskb edx,ymm1
       sub       rax,rcx
       mov       r8,rax
       shr       r8,3F
       add       rax,r8
       sar       rax,1
       mov       ecx,edx
       and       ecx,0FF0000FF
       and       edx,0FFFF00
       bswap     edx
       or        edx,ecx
       tzcnt     edx,edx
       add       eax,edx
       jmp       near ptr M01_L19
M01_L11:
       mov       r8,rdx
M01_L12:
       vmovdqu   ymm1,ymmword ptr [r8]
       vpackuswb ymm1,ymm1,[rdx]
       vpcmpeqb  ymm0,ymm0,ymm1
       vptest    ymm0,ymm0
       je        near ptr M01_L18
       vpmovmskb eax,ymm0
       mov       r9d,eax
       and       r9d,0FF0000FF
       and       eax,0FFFF00
       bswap     eax
       or        eax,r9d
       tzcnt     eax,eax
       cmp       eax,10
       jl        short M01_L13
       mov       r8,rdx
       add       eax,0FFFFFFF0
M01_L13:
       sub       r8,rcx
       mov       rcx,r8
       shr       rcx,3F
       add       rcx,r8
       sar       rcx,1
       add       eax,ecx
       jmp       short M01_L19
M01_L14:
       movzx     edx,dl
       vmovd     xmm0,edx
       vpbroadcastb xmm0,xmm0
       add       r8d,0FFFFFFF8
       movsxd    rdx,r8d
       lea       rax,[rax+rdx*2]
       cmp       rcx,rax
       ja        short M01_L15
       mov       rdx,rcx
       jmp       short M01_L16
M01_L15:
       mov       rdx,rax
M01_L16:
       vmovdqu   xmm1,xmmword ptr [rdx]
       vpackuswb xmm1,xmm1,[rax]
       vpcmpeqb  xmm0,xmm0,xmm1
       vptest    xmm0,xmm0
       je        short M01_L18
       vpmovmskb r8d,xmm0
       tzcnt     r8d,r8d
       cmp       r8d,8
       jl        short M01_L17
       mov       rdx,rax
       add       r8d,0FFFFFFF8
M01_L17:
       sub       rdx,rcx
       mov       rax,rdx
       shr       rax,3F
       add       rax,rdx
       sar       rax,1
       add       eax,r8d
       jmp       short M01_L19
M01_L18:
       mov       eax,0FFFFFFFF
M01_L19:
       vzeroupper
       ret
; Total bytes of code 500

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

### Run Information
Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Collections.ContainsTrue<Int32>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
ICollection - Duration of single invocation 15.39 μs 18.81 μs 1.22 0.29 False

graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Collections.ContainsTrue&lt;Int32&gt;*'

Payloads

Baseline
Compare

Histogram

System.Collections.ContainsTrue<Int32>.ICollection(Size: 512)


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 18.812553585737184 > 16.166368056674724.
IsChangePoint: Marked as a change because one of 12/28/2022 7:19:51 AM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -10.913943131320794 (T) = (0 -17977.113172313773) / Math.Sqrt((366279.03460540564 / (14)) + (832269.728650764 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.15957747280083848 = (15503.158343436882 - 17977.113172313773) / 15503.158343436882 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in PerfLabTests.CastingPerf

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
FooObjIsFoo - Duration of single invocation 385.23 μs 436.23 μs 1.13 0.05 False Trace Trace

graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'PerfLabTests.CastingPerf*'

Payloads

Baseline
Compare

Histogram

PerfLabTests.CastingPerf.FooObjIsFoo


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 436.2275347222222 > 403.5004232660061.
IsChangePoint: Marked as a change because one of 11/18/2022 8:48:12 PM, 12/17/2022 10:44:50 PM, 12/28/2022 5:13:50 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -16.98953576142652 (T) = (0 -432000.4274334723) / Math.Sqrt((4485019.553703565 / (14)) + (244235377.98573297 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.12268901979781549 = (384790.8190206323 - 432000.4274334723) / 384790.8190206323 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; PerfLabTests.CastingPerf.FooObjIsFoo()
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,28
       xor       esi,esi
       mov       edi,[7FF7F0E84C80]
       test      edi,edi
       jle       short M00_L02
       mov       rcx,16BB2406298
       mov       rbx,[rcx]
       mov       rbp,16BB24062A8
M00_L00:
       mov       rdx,rbx
       mov       rax,rdx
       test      rax,rax
       je        short M00_L01
       mov       rcx,offset MT_PerfLabTests.Foo[]
       cmp       [rax],rcx
       je        short M00_L01
       call      qword ptr [7FF7F06BD858]; System.Runtime.CompilerServices.CastHelpers.ChkCastAny(Void*, System.Object)
M00_L01:
       mov       rcx,rbp
       mov       rdx,rax
       call      CORINFO_HELP_ASSIGN_REF
       inc       esi
       cmp       esi,edi
       jl        short M00_L00
M00_L02:
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       ret
; Total bytes of code 101
; System.Runtime.CompilerServices.CastHelpers.ChkCastAny(Void*, System.Object)
       push      rdi
       push      rsi
       sub       rsp,28
       test      rdx,rdx
       je        near ptr M01_L03
       mov       rax,[rdx]
       cmp       rax,rcx
       je        near ptr M01_L03
       mov       r8,16BB2400D10
       mov       r8,[r8]
       add       r8,10
       rorx      r9,rax,20
       xor       r9,rcx
       mov       r10,9E3779B97F4A7C15
       imul      r9,r10
       mov       r10d,[r8]
       shrx      r9,r9,r10
       xor       r10d,r10d
M01_L00:
       lea       r11d,[r9+1]
       movsxd    r11,r11d
       lea       r11,[r11+r11*2]
       lea       r11,[r8+r11*8]
       mov       esi,[r11]
       mov       rdi,[r11+8]
       and       esi,0FFFFFFFE
       cmp       rdi,rax
       jne       short M01_L01
       mov       rdi,[r11+10]
       xor       rdi,rcx
       cmp       rdi,1
       jbe       short M01_L02
M01_L01:
       test      esi,esi
       je        short M01_L04
       inc       r10d
       add       r9d,r10d
       and       r9d,[r8+4]
       cmp       r10d,8
       jl        short M01_L00
       jmp       short M01_L04
M01_L02:
       cmp       esi,[r11]
       jne       short M01_L04
       mov       eax,edi
       cmp       eax,1
       jne       short M01_L04
M01_L03:
       mov       rax,rdx
       add       rsp,28
       pop       rsi
       pop       rdi
       ret
M01_L04:
       call      System.Runtime.CompilerServices.CastHelpers.ChkCastAny_NoCacheLookup(Void*, System.Object)
       nop
       add       rsp,28
       pop       rsi
       pop       rdi
       ret
; Total bytes of code 178

Compare Jit Disasm

; PerfLabTests.CastingPerf.FooObjIsFoo()
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,28
       xor       esi,esi
       mov       edi,[7FFCED872948]
       test      edi,edi
       jle       short M00_L02
       mov       rcx,1DAA8C06298
       mov       rbx,[rcx]
       mov       rbp,1DAA8C062A8
M00_L00:
       mov       rdx,rbx
       mov       rax,rdx
       test      rax,rax
       je        short M00_L01
       mov       rcx,offset MT_PerfLabTests.Foo[]
       cmp       [rax],rcx
       je        short M00_L01
       call      qword ptr [7FFCED0AD858]; System.Runtime.CompilerServices.CastHelpers.ChkCastAny(Void*, System.Object)
M00_L01:
       mov       rcx,rbp
       mov       rdx,rax
       call      CORINFO_HELP_ASSIGN_REF
       inc       esi
       cmp       esi,edi
       jl        short M00_L00
M00_L02:
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       ret
; Total bytes of code 101
; System.Runtime.CompilerServices.CastHelpers.ChkCastAny(Void*, System.Object)
       push      rdi
       push      rsi
       sub       rsp,28
       test      rdx,rdx
       je        near ptr M01_L03
       mov       rax,[rdx]
       cmp       rax,rcx
       je        near ptr M01_L03
       mov       r8,1DAA8C00D00
       mov       r8,[r8]
       cmp       [r8],r8b
       add       r8,10
       rorx      r9,rax,20
       xor       r9,rcx
       mov       r10,9E3779B97F4A7C15
       imul      r9,r10
       mov       r10d,[r8]
       shrx      r9,r9,r10
       xor       r10d,r10d
M01_L00:
       lea       r11d,[r9+1]
       movsxd    r11,r11d
       lea       r11,[r11+r11*2]
       lea       r11,[r8+r11*8]
       mov       esi,[r11]
       mov       rdi,[r11+8]
       and       esi,0FFFFFFFE
       cmp       rdi,rax
       jne       short M01_L01
       mov       rdi,[r11+10]
       xor       rdi,rcx
       cmp       rdi,1
       jbe       short M01_L02
M01_L01:
       test      esi,esi
       je        short M01_L04
       inc       r10d
       add       r9d,r10d
       and       r9d,[r8+4]
       cmp       r10d,8
       jl        short M01_L00
       jmp       short M01_L04
M01_L02:
       cmp       esi,[r11]
       jne       short M01_L04
       mov       eax,edi
       cmp       eax,1
       jne       short M01_L04
M01_L03:
       mov       rax,rdx
       add       rsp,28
       pop       rsi
       pop       rdi
       ret
M01_L04:
       call      System.Runtime.CompilerServices.CastHelpers.ChkCastAny_NoCacheLookup(Void*, System.Object)
       nop
       add       rsp,28
       pop       rsi
       pop       rdi
       ret
; Total bytes of code 181

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Collections.CreateAddAndClear<Int32>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
ICollection - Duration of single invocation 1.63 μs 1.83 μs 1.13 0.02 False

graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Collections.CreateAddAndClear&lt;Int32&gt;*'

Payloads

Baseline
Compare

Histogram

System.Collections.CreateAddAndClear<Int32>.ICollection(Size: 512)


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 1.8347209510950824 > 1.7145935758090685.
IsChangePoint: Marked as a change because one of 11/22/2022 2:20:42 AM, 12/3/2022 7:24:45 AM, 12/14/2022 12:26:48 AM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -21.759749761771584 (T) = (0 -1819.08470662877) / Math.Sqrt((40.76326172416319 / (14)) + (2366.6944079506234 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.11524646154459922 = (1631.1055621816236 - 1819.08470662877) / 1631.1055621816236 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Runtime.Intrinsics.Tests.Perf_Vector128Of<UInt64>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
GetHashCodeBenchmark - Duration of single invocation 7.60 ns 9.15 ns 1.20 0.13 False

graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Runtime.Intrinsics.Tests.Perf_Vector128Of&lt;UInt64&gt;*'

Payloads

Baseline
Compare

Histogram

System.Runtime.Intrinsics.Tests.Perf_Vector128Of<UInt64>.GetHashCodeBenchmark


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 9.147161227656825 > 8.075349868484022.
IsChangePoint: Marked as a change because one of 11/11/2022 5:53:56 PM, 12/6/2022 2:12:43 AM, 12/14/2022 5:20:21 PM, 12/17/2022 10:44:50 PM, 12/20/2022 1:34:12 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -17.474110982617642 (T) = (0 -9.060596191556709) / Math.Sqrt((0.0016581185117955867 / (14)) + (0.2014680503620295 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.17944647242766848 = (7.682074942245728 - 9.060596191556709) / 7.682074942245728 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Collections.IterateForEach<String>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
IEnumerable - Duration of single invocation 2.28 μs 2.91 μs 1.27 0.29 False
ReadOnlySpan - Duration of single invocation 173.47 ns 325.16 ns 1.87 0.00 False

graph
graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Collections.IterateForEach&lt;String&gt;*'

Payloads

Baseline
Compare

Histogram

System.Collections.IterateForEach<String>.IEnumerable(Size: 512)


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 2.91248045784478 > 2.391166037100214.
IsChangePoint: Marked as a change because one of 10/31/2022 10:23:25 PM, 12/14/2022 5:20:21 PM, 12/17/2022 10:44:50 PM, 12/20/2022 1:34:12 PM, 12/28/2022 5:13:50 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -17.677920465019326 (T) = (0 -2853.3674323593423) / Math.Sqrt((26.67604998255376 / (14)) + (34767.4375850699 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.25199927815342665 = (2279.0487839320267 - 2853.3674323593423) / 2279.0487839320267 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Collections.IterateForEach&lt;String&gt;.ReadOnlySpan(Size: 512)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 325.1636709836897 > 181.18397975718256.
IsChangePoint: Marked as a change because one of 1/6/2023 5:32:27 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -928.1634487515444 (T) = (0 -325.65916880497485) / Math.Sqrt((0.418308512508778 / (31)) + (0.21816701032631494 / (16))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (31) + (16) - 2, .025) and -0.8848011282319117 = (172.7817136391828 - 325.65916880497485) / 172.7817136391828 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Collections.AddGivenSize<Int32>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
ICollection - Duration of single invocation 1.40 μs 1.57 μs 1.12 0.06 False

graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Collections.AddGivenSize&lt;Int32&gt;*'

Payloads

Baseline
Compare

Histogram

System.Collections.AddGivenSize<Int32>.ICollection(Size: 512)


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 1.570026550304819 > 1.4688041877344602.
IsChangePoint: Marked as a change because one of 11/7/2022 4:10:19 PM, 11/11/2022 5:53:56 PM, 11/18/2022 8:48:12 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -8.660050955764135 (T) = (0 -1548.559956543519) / Math.Sqrt((2278.7573650785507 / (14)) + (3051.159380902667 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.09810725797757079 = (1410.2082882099928 - 1548.559956543519) / 1410.2082882099928 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

@performanceautofiler performanceautofiler bot added the untriaged New issue has not been triaged by the area owner label Jan 10, 2023
@EgorBo EgorBo changed the title [Perf] Windows/x64: 40 Regressions on 1/3/2023 9:28:36 AM Regressions around IndexOf Jan 10, 2023
@EgorBo EgorBo removed the untriaged New issue has not been triaged by the area owner label Jan 10, 2023
@dotnet-issue-labeler dotnet-issue-labeler bot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Jan 10, 2023
@EgorBo EgorBo transferred this issue from dotnet/perf-autofiling-issues Jan 10, 2023
@ghost ghost added the untriaged New issue has not been triaged by the area owner label Jan 10, 2023
@ghost
Copy link

ghost commented Jan 10, 2023

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch, @kunalspathak
See info in area-owners.md if you want to be subscribed.

Issue Details

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Text.RegularExpressions.Tests.Perf_Regex_Industry_Leipzig

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
Count - Duration of single invocation 8.68 ms 11.31 ms 1.30 0.05 False

graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Text.RegularExpressions.Tests.Perf_Regex_Industry_Leipzig*'

Payloads

Baseline
Compare

Histogram

System.Text.RegularExpressions.Tests.Perf_Regex_Industry_Leipzig.Count(Pattern: "(?i)Twain", Options: None)


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 11.31371125 > 9.244280525862068.
IsChangePoint: Marked as a change because one of 10/27/2022 12:34:03 AM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -6.374166673789645 (T) = (0 -9603758.60660944) / Math.Sqrt((8648777551.858488 / (14)) + (541761443840.9534 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.09484229454698666 = (8771819.150979357 - 9603758.60660944) / 8771819.150979357 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

### Run Information
Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Tests.Perf_String

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
Replace_Char - Duration of single invocation 4.17 ns 5.58 ns 1.34 0.05 False Trace Trace
TrimEnd_CharArr - Duration of single invocation 15.10 ns 16.24 ns 1.08 0.04 False Trace Trace
Replace_Char - Duration of single invocation 4.13 ns 6.14 ns 1.49 0.04 False Trace Trace
Replace_String - Duration of single invocation 52.91 ns 56.12 ns 1.06 0.17 False Trace Trace
Replace_Char - Duration of single invocation 19.53 ns 22.33 ns 1.14 0.06 False Trace Trace

graph
graph
graph
graph
graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Tests.Perf_String*'

Payloads

Baseline
Compare

Histogram

System.Tests.Perf_String.Replace_Char(text: "This is a very nice sentence", oldChar: 'z', newChar: 'y')


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 5.5791697719305775 > 4.373588329296491.
IsChangePoint: Marked as a change because one of 11/11/2022 5:53:56 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -27.243637733037268 (T) = (0 -5.4979369389559425) / Math.Sqrt((0.00019304484897805758 / (14)) + (0.07992415633537059 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.32372669563033424 = (4.15337770032501 - 5.4979369389559425) / 4.15337770032501 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFBA9C250C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,28
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     ecx,di
       movzx     r8d,bx
       cmp       ecx,r8d
       je        near ptr M01_L03
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       call      qword ptr [7FFBAA1C16A8]; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       test      ebp,ebp
       jge       short M01_L00
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L00:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L04
M01_L01:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L02
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L02:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFBAA3A3000]
       mov       rax,r15
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L03:
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L04:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFBAA0FFFA8]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L01
; Total bytes of code 231

Compare Jit Disasm

; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFB002F50C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,38
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     edx,di
       movzx     ecx,bx
       cmp       edx,ecx
       je        near ptr M01_L05
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       mov       [rsp+34],edx
       movzx     edx,word ptr [rsp+34]
       lea       eax,[rdx-1]
       cmp       eax,0FE
       jae       short M01_L00
       movsx     rdx,dx
       call      qword ptr [7FFB008958E8]; System.PackedSpanHelpers.IndexOf[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       jmp       short M01_L01
M01_L00:
       mov       edx,[rsp+34]
       call      qword ptr [7FFB00C2FB58]; System.SpanHelpers.NonPackedIndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
M01_L01:
       test      ebp,ebp
       jge       short M01_L02
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L02:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L06
M01_L03:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L04
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L04:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFB00A6B438]
       mov       rax,r15
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L05:
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L06:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFB007E1888]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L03
; Total bytes of code 266

System.Tests.Perf_String.TrimEnd_CharArr(s: "Test ", c: [' ', ' '])


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 16.243533696179 > 15.84953257735199.
IsChangePoint: Marked as a change because one of 11/18/2022 8:48:12 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -13.227699752533349 (T) = (0 -16.421167827143552) / Math.Sqrt((0.08018990762463707 / (14)) + (0.08814426859036918 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.07970713135289936 = (15.208909296141657 - 16.421167827143552) / 15.208909296141657 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_String.TrimEnd_CharArr(System.String, Char[])
       mov       rcx,rdx
       mov       rdx,r8
       cmp       [rcx],ecx
       jmp       qword ptr [7FFCA57154F8]; System.String.TrimEnd(Char[])
; Total bytes of code 14
; System.String.TrimEnd(Char[])
       sub       rsp,28
       xor       eax,eax
       mov       [rsp+20],rax
       test      rdx,rdx
       je        short M01_L00
       mov       r8d,[rdx+8]
       test      r8d,r8d
       je        short M01_L00
       add       rdx,10
       mov       [rsp+20],rdx
       mov       rdx,[rsp+20]
       mov       r9d,2
       call      qword ptr [7FFCA5715528]; System.String.TrimHelper(Char*, Int32, System.Text.TrimType)
       nop
       add       rsp,28
       ret
M01_L00:
       mov       edx,2
       call      qword ptr [7FFCA5715510]
       nop
       add       rsp,28
       ret
; Total bytes of code 74

Compare Jit Disasm

; System.Tests.Perf_String.TrimEnd_CharArr(System.String, Char[])
       mov       rcx,rdx
       mov       rdx,r8
       cmp       [rcx],ecx
       jmp       qword ptr [7FFEA49954F8]; System.String.TrimEnd(Char[])
; Total bytes of code 14
; System.String.TrimEnd(Char[])
       sub       rsp,28
       xor       eax,eax
       mov       [rsp+20],rax
       test      rdx,rdx
       je        short M01_L00
       mov       r8d,[rdx+8]
       test      r8d,r8d
       je        short M01_L00
       add       rdx,10
       mov       [rsp+20],rdx
       mov       rdx,[rsp+20]
       mov       r9d,2
       call      qword ptr [7FFEA4995528]; System.String.TrimHelper(Char*, Int32, System.Text.TrimType)
       nop
       add       rsp,28
       ret
M01_L00:
       mov       edx,2
       call      qword ptr [7FFEA4995510]
       nop
       add       rsp,28
       ret
; Total bytes of code 74

System.Tests.Perf_String.Replace_Char(text: "Hello", oldChar: 'a', newChar: 'b')


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 6.141896447049398 > 4.345308369149102.
IsChangePoint: Marked as a change because one of 10/25/2022 2:34:53 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -77.67081568675944 (T) = (0 -6.195133441371548) / Math.Sqrt((0.000163412449150792 / (14)) + (0.02276838353402995 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.4972135604471777 = (4.137775401607522 - 6.195133441371548) / 4.137775401607522 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFBA9C550C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,28
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     ecx,di
       movzx     r8d,bx
       cmp       ecx,r8d
       je        near ptr M01_L03
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       call      qword ptr [7FFBAA1F16A8]; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       test      ebp,ebp
       jge       short M01_L00
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L00:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L04
M01_L01:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L02
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L02:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFBAA3D3000]
       mov       rax,r15
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L03:
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L04:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFBAA12FFA8]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L01
; Total bytes of code 231

Compare Jit Disasm

; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFB003350C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,38
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     edx,di
       movzx     ecx,bx
       cmp       edx,ecx
       je        near ptr M01_L05
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       mov       [rsp+34],edx
       movzx     edx,word ptr [rsp+34]
       lea       eax,[rdx-1]
       cmp       eax,0FE
       jae       short M01_L00
       movsx     rdx,dx
       call      qword ptr [7FFB008D58E8]; System.PackedSpanHelpers.IndexOf[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       jmp       short M01_L01
M01_L00:
       mov       edx,[rsp+34]
       call      qword ptr [7FFB00C6FB58]; System.SpanHelpers.NonPackedIndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
M01_L01:
       test      ebp,ebp
       jge       short M01_L02
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L02:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L06
M01_L03:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L04
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L04:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFB00AAB438]
       mov       rax,r15
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L05:
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L06:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFB00821888]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L03
; Total bytes of code 266

System.Tests.Perf_String.Replace_String(text: "This is a very nice sentence. This is another very nice sentence.", oldValue: "a", newValue: "")


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 56.12304519478277 > 55.71160747100109.
IsChangePoint: Marked as a change because one of 11/17/2022 7:01:39 PM, 11/18/2022 3:21:53 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -5.791124591809122 (T) = (0 -56.58363624443871) / Math.Sqrt((2.1664145734713496 / (14)) + (2.5689714504370484 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.05192214047934187 = (53.790707569530355 - 56.58363624443871) / 53.790707569530355 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_String.Replace_String(System.String, System.String, System.String)
       mov       rcx,rdx
       mov       rdx,r8
       mov       r8,r9
       cmp       [rcx],ecx
       jmp       qword ptr [7FFCE0E250D8]; System.String.Replace(System.String, System.String)
; Total bytes of code 17
; System.String.Replace(System.String, System.String)
       push      rbp
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbx
       sub       rsp,58
       lea       rbp,[rsp+20]
       xor       eax,eax
       mov       [rbp+8],rax
       vxorps    xmm4,xmm4,xmm4
       vmovdqa   xmmword ptr [rbp+10],xmm4
       vmovdqa   xmmword ptr [rbp+20],xmm4
       mov       [rbp+30],rax
       mov       rax,0C6A9C64BB2F3
       mov       [rbp],rax
       mov       rsi,rcx
       mov       rdi,rdx
       mov       rbx,r8
       test      rdi,rdi
       je        near ptr M01_L15
       mov       r14d,[rdi+8]
       test      r14d,r14d
       je        near ptr M01_L15
       test      rbx,rbx
       jne       short M01_L00
       mov       rbx,7FFCE0EC0008
M01_L00:
       test      [rsp],esp
       sub       rsp,200
       lea       rdx,[rsp+20]
       mov       [rbp+28],rdx
       mov       dword ptr [rbp+30],80
       xor       edx,edx
       mov       [rbp+18],rdx
       mov       [rbp+20],edx
       cmp       r14d,1
       jne       near ptr M01_L06
       cmp       dword ptr [rbx+8],1
       jne       short M01_L02
       movzx     edx,word ptr [rdi+0C]
       movzx     r8d,word ptr [rbx+0C]
       mov       rcx,rsi
       call      qword ptr [7FFCE0E250C0]; System.String.Replace(Char, Char)
       mov       rcx,0C6A9C64BB2F3
       cmp       [rbp],rcx
       je        short M01_L01
       call      CORINFO_HELP_FAIL_FAST
M01_L01:
       nop
       lea       rsp,[rbp+38]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L02:
       movzx     edi,word ptr [rdi+0C]
       xor       r15d,r15d
M01_L03:
       movsxd    rcx,r15d
       lea       rcx,[rsi+rcx*2+0C]
       mov       r8d,[rsi+8]
       sub       r8d,r15d
       movsx     rdx,di
       call      qword ptr [7FFCE13C16A8]; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       test      eax,eax
       jl        near ptr M01_L10
       add       r15d,eax
       mov       edx,r15d
       mov       ecx,[rbp+20]
       mov       rax,[rbp+28]
       mov       r8d,[rbp+30]
       cmp       ecx,r8d
       jae       short M01_L04
       mov       r8d,ecx
       mov       [rax+r8*4],edx
       inc       ecx
       mov       [rbp+20],ecx
       jmp       short M01_L05
M01_L04:
       lea       rcx,[rbp+18]
       call      qword ptr [7FFCE17ABC30]
M01_L05:
       inc       r15d
       jmp       short M01_L03
M01_L06:
       xor       r15d,r15d
M01_L07:
       movsxd    rcx,r15d
       lea       rcx,[rsi+rcx*2+0C]
       mov       edx,[rsi+8]
       sub       edx,r15d
       lea       r8,[rdi+0C]
       mov       r9d,r14d
       call      qword ptr [7FFCE12D1408]
       test      eax,eax
       jl        short M01_L10
       add       r15d,eax
       mov       edx,r15d
       mov       ecx,[rbp+20]
       mov       rax,[rbp+28]
       mov       r8d,[rbp+30]
       cmp       ecx,r8d
       jae       short M01_L08
       mov       r8d,ecx
       mov       [rax+r8*4],edx
       inc       ecx
       mov       [rbp+20],ecx
       jmp       short M01_L09
M01_L08:
       lea       rcx,[rbp+18]
       call      qword ptr [7FFCE17ABC30]
M01_L09:
       add       r15d,r14d
       jmp       short M01_L07
M01_L10:
       cmp       dword ptr [rbp+20],0
       jne       short M01_L12
       mov       rax,rsi
       mov       rcx,0C6A9C64BB2F3
       cmp       [rbp],rcx
       je        short M01_L11
       call      CORINFO_HELP_FAIL_FAST
M01_L11:
       nop
       lea       rsp,[rbp+38]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L12:
       mov       edx,r14d
       mov       ecx,[rbp+20]
       cmp       ecx,[rbp+30]
       ja        near ptr M01_L16
       mov       r8,[rbp+28]
       mov       [rbp+8],r8
       mov       [rbp+10],ecx
       mov       rcx,rsi
       mov       r8,rbx
       lea       r9,[rbp+8]
       call      qword ptr [7FFCE0E250F0]; System.String.ReplaceHelper(Int32, System.String, System.ReadOnlySpan`1<Int32>)
       mov       rdi,rax
       mov       rsi,[rbp+18]
       test      rsi,rsi
       je        short M01_L13
       xor       ecx,ecx
       mov       [rbp+18],rcx
       mov       rcx,7FFCE0D84D68
       mov       edx,31
       call      CORINFO_HELP_CLASSINIT_SHARED_DYNAMICCLASS
       mov       rcx,1A6AE807CD0
       mov       rcx,[rcx]
       mov       rdx,rsi
       xor       r8d,r8d
       cmp       [rcx],ecx
       call      qword ptr [7FFCE1799680]; System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1[[System.Int32, System.Private.CoreLib]].Return(Int32[], Boolean)
M01_L13:
       mov       rax,rdi
       mov       rcx,0C6A9C64BB2F3
       cmp       [rbp],rcx
       je        short M01_L14
       call      CORINFO_HELP_FAIL_FAST
M01_L14:
       nop
       lea       rsp,[rbp+38]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L15:
       mov       ecx,16A1
       mov       rdx,7FFCE0C64000
       call      CORINFO_HELP_STRCNS
       mov       rdx,rax
       mov       rcx,rdi
       call      qword ptr [7FFCE0E2DC78]
       int       3
M01_L16:
       call      qword ptr [7FFCE15734E0]
       int       3
; Total bytes of code 610

Compare Jit Disasm

; System.Tests.Perf_String.Replace_String(System.String, System.String, System.String)
       mov       rcx,rdx
       mov       rdx,r8
       mov       r8,r9
       cmp       [rcx],ecx
       jmp       qword ptr [7FFEA49B50D8]; System.String.Replace(System.String, System.String)
; Total bytes of code 17
; System.String.Replace(System.String, System.String)
       push      rbp
       push      r15
       push      r14
       push      r12
       push      rdi
       push      rsi
       push      rbx
       sub       rsp,60
       lea       rbp,[rsp+20]
       xor       eax,eax
       mov       [rbp+8],rax
       vxorps    xmm4,xmm4,xmm4
       vmovdqa   xmmword ptr [rbp+10],xmm4
       vmovdqa   xmmword ptr [rbp+20],xmm4
       vmovdqa   xmmword ptr [rbp+30],xmm4
       mov       rax,23C2D26E54EC
       mov       [rbp],rax
       mov       rsi,rcx
       mov       rdi,rdx
       mov       rbx,r8
       test      rdi,rdi
       je        near ptr M01_L17
       mov       r14d,[rdi+8]
       test      r14d,r14d
       je        near ptr M01_L17
       test      rbx,rbx
       jne       short M01_L00
       mov       rbx,7FFEA4A50008
M01_L00:
       test      [rsp],esp
       sub       rsp,200
       lea       rdx,[rsp+20]
       mov       [rbp+30],rdx
       mov       dword ptr [rbp+38],80
       xor       edx,edx
       mov       [rbp+20],rdx
       mov       [rbp+28],edx
       cmp       r14d,1
       jne       near ptr M01_L08
       cmp       dword ptr [rbx+8],1
       jne       short M01_L02
       movzx     edx,word ptr [rdi+0C]
       movzx     r8d,word ptr [rbx+0C]
       mov       rcx,rsi
       call      qword ptr [7FFEA49B50C0]; System.String.Replace(Char, Char)
       mov       rcx,23C2D26E54EC
       cmp       [rbp],rcx
       je        short M01_L01
       call      CORINFO_HELP_FAIL_FAST
M01_L01:
       nop
       lea       rsp,[rbp+40]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r12
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L02:
       movzx     edi,word ptr [rdi+0C]
       xor       r15d,r15d
M01_L03:
       movsxd    rdx,r15d
       lea       rcx,[rsi+rdx*2+0C]
       mov       r8d,[rsi+8]
       sub       r8d,r15d
       movsx     rdx,di
       mov       [rbp+1C],edx
       movzx     edx,word ptr [rbp+1C]
       dec       edx
       cmp       edx,0FE
       jae       short M01_L04
       movzx     edx,word ptr [rbp+1C]
       movsx     rdx,dx
       call      qword ptr [7FFEA4F558E8]; System.PackedSpanHelpers.IndexOf[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       r12d,eax
       jmp       short M01_L05
M01_L04:
       mov       edx,[rbp+1C]
       call      qword ptr [7FFEA52EFB58]; System.SpanHelpers.NonPackedIndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       r12d,eax
M01_L05:
       test      r12d,r12d
       jl        near ptr M01_L12
       lea       edx,[r15+r12]
       mov       ecx,[rbp+28]
       mov       rax,[rbp+30]
       mov       r8d,[rbp+38]
       cmp       ecx,r8d
       jae       short M01_L06
       mov       r8d,ecx
       mov       [rax+r8*4],edx
       inc       ecx
       mov       [rbp+28],ecx
       jmp       short M01_L07
M01_L06:
       lea       rcx,[rbp+20]
       call      qword ptr [7FFEA532DC48]
M01_L07:
       lea       r15d,[r15+r12+1]
       jmp       short M01_L03
M01_L08:
       xor       r15d,r15d
M01_L09:
       movsxd    rcx,r15d
       lea       rcx,[rsi+rcx*2+0C]
       mov       edx,[rsi+8]
       sub       edx,r15d
       lea       r8,[rdi+0C]
       mov       r9d,r14d
       call      qword ptr [7FFEA4E61408]
       mov       r12d,eax
       test      r12d,r12d
       jl        short M01_L12
       lea       edx,[r15+r12]
       mov       ecx,[rbp+28]
       mov       rax,[rbp+30]
       mov       r8d,[rbp+38]
       cmp       ecx,r8d
       jae       short M01_L10
       mov       r8d,ecx
       mov       [rax+r8*4],edx
       inc       ecx
       mov       [rbp+28],ecx
       jmp       short M01_L11
M01_L10:
       lea       rcx,[rbp+20]
       call      qword ptr [7FFEA532DC48]
M01_L11:
       add       r15d,r12d
       add       r15d,r14d
       jmp       short M01_L09
M01_L12:
       cmp       dword ptr [rbp+28],0
       jne       short M01_L14
       mov       rax,rsi
       mov       rcx,23C2D26E54EC
       cmp       [rbp],rcx
       je        short M01_L13
       call      CORINFO_HELP_FAIL_FAST
M01_L13:
       nop
       lea       rsp,[rbp+40]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r12
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L14:
       mov       edx,r14d
       mov       ecx,[rbp+28]
       cmp       ecx,[rbp+38]
       ja        near ptr M01_L18
       mov       r8,[rbp+30]
       mov       [rbp+8],r8
       mov       [rbp+10],ecx
       mov       rcx,rsi
       mov       r8,rbx
       lea       r9,[rbp+8]
       call      qword ptr [7FFEA49B50F0]; System.String.ReplaceHelper(Int32, System.String, System.ReadOnlySpan`1<Int32>)
       mov       rdi,rax
       mov       rsi,[rbp+20]
       test      rsi,rsi
       je        short M01_L15
       xor       ecx,ecx
       mov       [rbp+20],rcx
       mov       rcx,7FFEA4914DB8
       mov       edx,31
       call      CORINFO_HELP_CLASSINIT_SHARED_DYNAMICCLASS
       mov       rcx,22F6A407CD8
       mov       rcx,[rcx]
       mov       rdx,rsi
       xor       r8d,r8d
       cmp       [rcx],ecx
       call      qword ptr [7FFEA5335560]; System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1[[System.Int32, System.Private.CoreLib]].Return(Int32[], Boolean)
M01_L15:
       mov       rax,rdi
       mov       rcx,23C2D26E54EC
       cmp       [rbp],rcx
       je        short M01_L16
       call      CORINFO_HELP_FAIL_FAST
M01_L16:
       nop
       lea       rsp,[rbp+40]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r12
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L17:
       mov       ecx,16A1
       mov       rdx,7FFEA47F4000
       call      CORINFO_HELP_STRCNS
       mov       rdx,rax
       mov       rcx,rdi
       call      qword ptr [7FFEA49BDC78]
       int       3
M01_L18:
       call      qword ptr [7FFEA4ED3060]
       int       3
; Total bytes of code 667

System.Tests.Perf_String.Replace_Char(text: "This is a very nice sentence", oldChar: 'i', newChar: 'I')


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 22.330607657133392 > 20.635651568171316.
IsChangePoint: Marked as a change because one of 11/11/2022 5:53:56 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -19.533480701550356 (T) = (0 -22.051279089043497) / Math.Sqrt((0.04802330264672898 / (14)) + (0.36899131861666284 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.11991782255368702 = (19.69008675900985 - 22.051279089043497) / 19.69008675900985 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFBA9C050C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,28
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     ecx,di
       movzx     r8d,bx
       cmp       ecx,r8d
       je        near ptr M01_L03
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       call      qword ptr [7FFBAA1A16A8]; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       test      ebp,ebp
       jge       short M01_L00
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L00:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L04
M01_L01:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L02
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L02:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFBAA383000]; System.SpanHelpers.ReplaceValueType[[System.UInt16, System.Private.CoreLib]](UInt16 ByRef, UInt16 ByRef, UInt16, UInt16, UIntPtr)
       mov       rax,r15
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L03:
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L04:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFBAA0DFFA8]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L01
; Total bytes of code 231

Compare Jit Disasm

; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFB002E50C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,38
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     edx,di
       movzx     ecx,bx
       cmp       edx,ecx
       je        near ptr M01_L05
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       mov       [rsp+34],edx
       movzx     edx,word ptr [rsp+34]
       lea       eax,[rdx-1]
       cmp       eax,0FE
       jae       short M01_L00
       movsx     rdx,dx
       call      qword ptr [7FFB008858E8]; System.PackedSpanHelpers.IndexOf[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       jmp       short M01_L01
M01_L00:
       mov       edx,[rsp+34]
       call      qword ptr [7FFB00C1FB58]; System.SpanHelpers.NonPackedIndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
M01_L01:
       test      ebp,ebp
       jge       short M01_L02
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L02:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L06
M01_L03:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L04
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L04:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFB00A5B438]; System.SpanHelpers.ReplaceValueType[[System.UInt16, System.Private.CoreLib]](UInt16 ByRef, UInt16 ByRef, UInt16, UInt16, UIntPtr)
       mov       rax,r15
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L05:
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L06:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFB007D1888]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L03
; Total bytes of code 266

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Memory.Span<Int32>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
IndexOfAnyFourValues - Duration of single invocation 811.41 ns 893.12 ns 1.10 0.04 False
IndexOfAnyFiveValues - Duration of single invocation 857.19 ns 916.26 ns 1.07 0.08 False

graph
graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Memory.Span&lt;Int32&gt;*'

Payloads

Baseline
Compare

Histogram

System.Memory.Span<Int32>.IndexOfAnyFourValues(Size: 512)


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 893.115476054079 > 853.6086389195757.
IsChangePoint: Marked as a change because one of 10/26/2022 7:11:30 AM, 10/31/2022 10:23:25 PM, 11/11/2022 5:53:56 PM, 11/18/2022 8:48:12 PM, 12/12/2022 5:25:39 PM, 12/17/2022 10:44:50 PM, 12/21/2022 9:23:17 AM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -17.655352723675087 (T) = (0 -886.6573219555273) / Math.Sqrt((4.976405318076591 / (14)) + (550.567469208571 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.08955635836868671 = (813.7783008150718 - 886.6573219555273) / 813.7783008150718 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Int32&gt;.IndexOfAnyFiveValues(Size: 512)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 916.2596480801636 > 884.884366122159.
IsChangePoint: Marked as a change because one of 11/11/2022 5:53:56 PM, 11/18/2022 8:48:12 PM, 12/12/2022 5:25:39 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -14.792582161741155 (T) = (0 -919.5926411095774) / Math.Sqrt((234.02346260062512 / (14)) + (404.93175657466077 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.09481762636242623 = (839.9505259747775 - 919.5926411095774) / 839.9505259747775 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Author: performanceautofiler[bot]
Assignees: dakersnar
Labels:

area-CodeGen-coreclr

Milestone: -

@EgorBo EgorBo assigned MihaZupan and unassigned dakersnar Jan 10, 2023
@EgorBo EgorBo added area-System.Runtime and removed area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Jan 10, 2023
@ghost
Copy link

ghost commented Jan 10, 2023

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

Issue Details

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Text.RegularExpressions.Tests.Perf_Regex_Industry_Leipzig

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
Count - Duration of single invocation 8.68 ms 11.31 ms 1.30 0.05 False

graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Text.RegularExpressions.Tests.Perf_Regex_Industry_Leipzig*'

Payloads

Baseline
Compare

Histogram

System.Text.RegularExpressions.Tests.Perf_Regex_Industry_Leipzig.Count(Pattern: "(?i)Twain", Options: None)


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 11.31371125 > 9.244280525862068.
IsChangePoint: Marked as a change because one of 10/27/2022 12:34:03 AM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -6.374166673789645 (T) = (0 -9603758.60660944) / Math.Sqrt((8648777551.858488 / (14)) + (541761443840.9534 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.09484229454698666 = (8771819.150979357 - 9603758.60660944) / 8771819.150979357 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

### Run Information
Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Tests.Perf_String

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
Replace_Char - Duration of single invocation 4.17 ns 5.58 ns 1.34 0.05 False Trace Trace
TrimEnd_CharArr - Duration of single invocation 15.10 ns 16.24 ns 1.08 0.04 False Trace Trace
Replace_Char - Duration of single invocation 4.13 ns 6.14 ns 1.49 0.04 False Trace Trace
Replace_String - Duration of single invocation 52.91 ns 56.12 ns 1.06 0.17 False Trace Trace
Replace_Char - Duration of single invocation 19.53 ns 22.33 ns 1.14 0.06 False Trace Trace

graph
graph
graph
graph
graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Tests.Perf_String*'

Payloads

Baseline
Compare

Histogram

System.Tests.Perf_String.Replace_Char(text: "This is a very nice sentence", oldChar: 'z', newChar: 'y')


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 5.5791697719305775 > 4.373588329296491.
IsChangePoint: Marked as a change because one of 11/11/2022 5:53:56 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -27.243637733037268 (T) = (0 -5.4979369389559425) / Math.Sqrt((0.00019304484897805758 / (14)) + (0.07992415633537059 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.32372669563033424 = (4.15337770032501 - 5.4979369389559425) / 4.15337770032501 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFBA9C250C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,28
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     ecx,di
       movzx     r8d,bx
       cmp       ecx,r8d
       je        near ptr M01_L03
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       call      qword ptr [7FFBAA1C16A8]; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       test      ebp,ebp
       jge       short M01_L00
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L00:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L04
M01_L01:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L02
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L02:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFBAA3A3000]
       mov       rax,r15
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L03:
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L04:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFBAA0FFFA8]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L01
; Total bytes of code 231

Compare Jit Disasm

; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFB002F50C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,38
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     edx,di
       movzx     ecx,bx
       cmp       edx,ecx
       je        near ptr M01_L05
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       mov       [rsp+34],edx
       movzx     edx,word ptr [rsp+34]
       lea       eax,[rdx-1]
       cmp       eax,0FE
       jae       short M01_L00
       movsx     rdx,dx
       call      qword ptr [7FFB008958E8]; System.PackedSpanHelpers.IndexOf[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       jmp       short M01_L01
M01_L00:
       mov       edx,[rsp+34]
       call      qword ptr [7FFB00C2FB58]; System.SpanHelpers.NonPackedIndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
M01_L01:
       test      ebp,ebp
       jge       short M01_L02
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L02:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L06
M01_L03:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L04
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L04:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFB00A6B438]
       mov       rax,r15
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L05:
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L06:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFB007E1888]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L03
; Total bytes of code 266

System.Tests.Perf_String.TrimEnd_CharArr(s: "Test ", c: [' ', ' '])


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 16.243533696179 > 15.84953257735199.
IsChangePoint: Marked as a change because one of 11/18/2022 8:48:12 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -13.227699752533349 (T) = (0 -16.421167827143552) / Math.Sqrt((0.08018990762463707 / (14)) + (0.08814426859036918 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.07970713135289936 = (15.208909296141657 - 16.421167827143552) / 15.208909296141657 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_String.TrimEnd_CharArr(System.String, Char[])
       mov       rcx,rdx
       mov       rdx,r8
       cmp       [rcx],ecx
       jmp       qword ptr [7FFCA57154F8]; System.String.TrimEnd(Char[])
; Total bytes of code 14
; System.String.TrimEnd(Char[])
       sub       rsp,28
       xor       eax,eax
       mov       [rsp+20],rax
       test      rdx,rdx
       je        short M01_L00
       mov       r8d,[rdx+8]
       test      r8d,r8d
       je        short M01_L00
       add       rdx,10
       mov       [rsp+20],rdx
       mov       rdx,[rsp+20]
       mov       r9d,2
       call      qword ptr [7FFCA5715528]; System.String.TrimHelper(Char*, Int32, System.Text.TrimType)
       nop
       add       rsp,28
       ret
M01_L00:
       mov       edx,2
       call      qword ptr [7FFCA5715510]
       nop
       add       rsp,28
       ret
; Total bytes of code 74

Compare Jit Disasm

; System.Tests.Perf_String.TrimEnd_CharArr(System.String, Char[])
       mov       rcx,rdx
       mov       rdx,r8
       cmp       [rcx],ecx
       jmp       qword ptr [7FFEA49954F8]; System.String.TrimEnd(Char[])
; Total bytes of code 14
; System.String.TrimEnd(Char[])
       sub       rsp,28
       xor       eax,eax
       mov       [rsp+20],rax
       test      rdx,rdx
       je        short M01_L00
       mov       r8d,[rdx+8]
       test      r8d,r8d
       je        short M01_L00
       add       rdx,10
       mov       [rsp+20],rdx
       mov       rdx,[rsp+20]
       mov       r9d,2
       call      qword ptr [7FFEA4995528]; System.String.TrimHelper(Char*, Int32, System.Text.TrimType)
       nop
       add       rsp,28
       ret
M01_L00:
       mov       edx,2
       call      qword ptr [7FFEA4995510]
       nop
       add       rsp,28
       ret
; Total bytes of code 74

System.Tests.Perf_String.Replace_Char(text: "Hello", oldChar: 'a', newChar: 'b')


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 6.141896447049398 > 4.345308369149102.
IsChangePoint: Marked as a change because one of 10/25/2022 2:34:53 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -77.67081568675944 (T) = (0 -6.195133441371548) / Math.Sqrt((0.000163412449150792 / (14)) + (0.02276838353402995 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.4972135604471777 = (4.137775401607522 - 6.195133441371548) / 4.137775401607522 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFBA9C550C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,28
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     ecx,di
       movzx     r8d,bx
       cmp       ecx,r8d
       je        near ptr M01_L03
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       call      qword ptr [7FFBAA1F16A8]; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       test      ebp,ebp
       jge       short M01_L00
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L00:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L04
M01_L01:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L02
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L02:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFBAA3D3000]
       mov       rax,r15
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L03:
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L04:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFBAA12FFA8]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L01
; Total bytes of code 231

Compare Jit Disasm

; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFB003350C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,38
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     edx,di
       movzx     ecx,bx
       cmp       edx,ecx
       je        near ptr M01_L05
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       mov       [rsp+34],edx
       movzx     edx,word ptr [rsp+34]
       lea       eax,[rdx-1]
       cmp       eax,0FE
       jae       short M01_L00
       movsx     rdx,dx
       call      qword ptr [7FFB008D58E8]; System.PackedSpanHelpers.IndexOf[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       jmp       short M01_L01
M01_L00:
       mov       edx,[rsp+34]
       call      qword ptr [7FFB00C6FB58]; System.SpanHelpers.NonPackedIndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
M01_L01:
       test      ebp,ebp
       jge       short M01_L02
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L02:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L06
M01_L03:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L04
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L04:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFB00AAB438]
       mov       rax,r15
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L05:
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L06:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFB00821888]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L03
; Total bytes of code 266

System.Tests.Perf_String.Replace_String(text: "This is a very nice sentence. This is another very nice sentence.", oldValue: "a", newValue: "")


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 56.12304519478277 > 55.71160747100109.
IsChangePoint: Marked as a change because one of 11/17/2022 7:01:39 PM, 11/18/2022 3:21:53 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -5.791124591809122 (T) = (0 -56.58363624443871) / Math.Sqrt((2.1664145734713496 / (14)) + (2.5689714504370484 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.05192214047934187 = (53.790707569530355 - 56.58363624443871) / 53.790707569530355 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_String.Replace_String(System.String, System.String, System.String)
       mov       rcx,rdx
       mov       rdx,r8
       mov       r8,r9
       cmp       [rcx],ecx
       jmp       qword ptr [7FFCE0E250D8]; System.String.Replace(System.String, System.String)
; Total bytes of code 17
; System.String.Replace(System.String, System.String)
       push      rbp
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbx
       sub       rsp,58
       lea       rbp,[rsp+20]
       xor       eax,eax
       mov       [rbp+8],rax
       vxorps    xmm4,xmm4,xmm4
       vmovdqa   xmmword ptr [rbp+10],xmm4
       vmovdqa   xmmword ptr [rbp+20],xmm4
       mov       [rbp+30],rax
       mov       rax,0C6A9C64BB2F3
       mov       [rbp],rax
       mov       rsi,rcx
       mov       rdi,rdx
       mov       rbx,r8
       test      rdi,rdi
       je        near ptr M01_L15
       mov       r14d,[rdi+8]
       test      r14d,r14d
       je        near ptr M01_L15
       test      rbx,rbx
       jne       short M01_L00
       mov       rbx,7FFCE0EC0008
M01_L00:
       test      [rsp],esp
       sub       rsp,200
       lea       rdx,[rsp+20]
       mov       [rbp+28],rdx
       mov       dword ptr [rbp+30],80
       xor       edx,edx
       mov       [rbp+18],rdx
       mov       [rbp+20],edx
       cmp       r14d,1
       jne       near ptr M01_L06
       cmp       dword ptr [rbx+8],1
       jne       short M01_L02
       movzx     edx,word ptr [rdi+0C]
       movzx     r8d,word ptr [rbx+0C]
       mov       rcx,rsi
       call      qword ptr [7FFCE0E250C0]; System.String.Replace(Char, Char)
       mov       rcx,0C6A9C64BB2F3
       cmp       [rbp],rcx
       je        short M01_L01
       call      CORINFO_HELP_FAIL_FAST
M01_L01:
       nop
       lea       rsp,[rbp+38]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L02:
       movzx     edi,word ptr [rdi+0C]
       xor       r15d,r15d
M01_L03:
       movsxd    rcx,r15d
       lea       rcx,[rsi+rcx*2+0C]
       mov       r8d,[rsi+8]
       sub       r8d,r15d
       movsx     rdx,di
       call      qword ptr [7FFCE13C16A8]; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       test      eax,eax
       jl        near ptr M01_L10
       add       r15d,eax
       mov       edx,r15d
       mov       ecx,[rbp+20]
       mov       rax,[rbp+28]
       mov       r8d,[rbp+30]
       cmp       ecx,r8d
       jae       short M01_L04
       mov       r8d,ecx
       mov       [rax+r8*4],edx
       inc       ecx
       mov       [rbp+20],ecx
       jmp       short M01_L05
M01_L04:
       lea       rcx,[rbp+18]
       call      qword ptr [7FFCE17ABC30]
M01_L05:
       inc       r15d
       jmp       short M01_L03
M01_L06:
       xor       r15d,r15d
M01_L07:
       movsxd    rcx,r15d
       lea       rcx,[rsi+rcx*2+0C]
       mov       edx,[rsi+8]
       sub       edx,r15d
       lea       r8,[rdi+0C]
       mov       r9d,r14d
       call      qword ptr [7FFCE12D1408]
       test      eax,eax
       jl        short M01_L10
       add       r15d,eax
       mov       edx,r15d
       mov       ecx,[rbp+20]
       mov       rax,[rbp+28]
       mov       r8d,[rbp+30]
       cmp       ecx,r8d
       jae       short M01_L08
       mov       r8d,ecx
       mov       [rax+r8*4],edx
       inc       ecx
       mov       [rbp+20],ecx
       jmp       short M01_L09
M01_L08:
       lea       rcx,[rbp+18]
       call      qword ptr [7FFCE17ABC30]
M01_L09:
       add       r15d,r14d
       jmp       short M01_L07
M01_L10:
       cmp       dword ptr [rbp+20],0
       jne       short M01_L12
       mov       rax,rsi
       mov       rcx,0C6A9C64BB2F3
       cmp       [rbp],rcx
       je        short M01_L11
       call      CORINFO_HELP_FAIL_FAST
M01_L11:
       nop
       lea       rsp,[rbp+38]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L12:
       mov       edx,r14d
       mov       ecx,[rbp+20]
       cmp       ecx,[rbp+30]
       ja        near ptr M01_L16
       mov       r8,[rbp+28]
       mov       [rbp+8],r8
       mov       [rbp+10],ecx
       mov       rcx,rsi
       mov       r8,rbx
       lea       r9,[rbp+8]
       call      qword ptr [7FFCE0E250F0]; System.String.ReplaceHelper(Int32, System.String, System.ReadOnlySpan`1<Int32>)
       mov       rdi,rax
       mov       rsi,[rbp+18]
       test      rsi,rsi
       je        short M01_L13
       xor       ecx,ecx
       mov       [rbp+18],rcx
       mov       rcx,7FFCE0D84D68
       mov       edx,31
       call      CORINFO_HELP_CLASSINIT_SHARED_DYNAMICCLASS
       mov       rcx,1A6AE807CD0
       mov       rcx,[rcx]
       mov       rdx,rsi
       xor       r8d,r8d
       cmp       [rcx],ecx
       call      qword ptr [7FFCE1799680]; System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1[[System.Int32, System.Private.CoreLib]].Return(Int32[], Boolean)
M01_L13:
       mov       rax,rdi
       mov       rcx,0C6A9C64BB2F3
       cmp       [rbp],rcx
       je        short M01_L14
       call      CORINFO_HELP_FAIL_FAST
M01_L14:
       nop
       lea       rsp,[rbp+38]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L15:
       mov       ecx,16A1
       mov       rdx,7FFCE0C64000
       call      CORINFO_HELP_STRCNS
       mov       rdx,rax
       mov       rcx,rdi
       call      qword ptr [7FFCE0E2DC78]
       int       3
M01_L16:
       call      qword ptr [7FFCE15734E0]
       int       3
; Total bytes of code 610

Compare Jit Disasm

; System.Tests.Perf_String.Replace_String(System.String, System.String, System.String)
       mov       rcx,rdx
       mov       rdx,r8
       mov       r8,r9
       cmp       [rcx],ecx
       jmp       qword ptr [7FFEA49B50D8]; System.String.Replace(System.String, System.String)
; Total bytes of code 17
; System.String.Replace(System.String, System.String)
       push      rbp
       push      r15
       push      r14
       push      r12
       push      rdi
       push      rsi
       push      rbx
       sub       rsp,60
       lea       rbp,[rsp+20]
       xor       eax,eax
       mov       [rbp+8],rax
       vxorps    xmm4,xmm4,xmm4
       vmovdqa   xmmword ptr [rbp+10],xmm4
       vmovdqa   xmmword ptr [rbp+20],xmm4
       vmovdqa   xmmword ptr [rbp+30],xmm4
       mov       rax,23C2D26E54EC
       mov       [rbp],rax
       mov       rsi,rcx
       mov       rdi,rdx
       mov       rbx,r8
       test      rdi,rdi
       je        near ptr M01_L17
       mov       r14d,[rdi+8]
       test      r14d,r14d
       je        near ptr M01_L17
       test      rbx,rbx
       jne       short M01_L00
       mov       rbx,7FFEA4A50008
M01_L00:
       test      [rsp],esp
       sub       rsp,200
       lea       rdx,[rsp+20]
       mov       [rbp+30],rdx
       mov       dword ptr [rbp+38],80
       xor       edx,edx
       mov       [rbp+20],rdx
       mov       [rbp+28],edx
       cmp       r14d,1
       jne       near ptr M01_L08
       cmp       dword ptr [rbx+8],1
       jne       short M01_L02
       movzx     edx,word ptr [rdi+0C]
       movzx     r8d,word ptr [rbx+0C]
       mov       rcx,rsi
       call      qword ptr [7FFEA49B50C0]; System.String.Replace(Char, Char)
       mov       rcx,23C2D26E54EC
       cmp       [rbp],rcx
       je        short M01_L01
       call      CORINFO_HELP_FAIL_FAST
M01_L01:
       nop
       lea       rsp,[rbp+40]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r12
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L02:
       movzx     edi,word ptr [rdi+0C]
       xor       r15d,r15d
M01_L03:
       movsxd    rdx,r15d
       lea       rcx,[rsi+rdx*2+0C]
       mov       r8d,[rsi+8]
       sub       r8d,r15d
       movsx     rdx,di
       mov       [rbp+1C],edx
       movzx     edx,word ptr [rbp+1C]
       dec       edx
       cmp       edx,0FE
       jae       short M01_L04
       movzx     edx,word ptr [rbp+1C]
       movsx     rdx,dx
       call      qword ptr [7FFEA4F558E8]; System.PackedSpanHelpers.IndexOf[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       r12d,eax
       jmp       short M01_L05
M01_L04:
       mov       edx,[rbp+1C]
       call      qword ptr [7FFEA52EFB58]; System.SpanHelpers.NonPackedIndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       r12d,eax
M01_L05:
       test      r12d,r12d
       jl        near ptr M01_L12
       lea       edx,[r15+r12]
       mov       ecx,[rbp+28]
       mov       rax,[rbp+30]
       mov       r8d,[rbp+38]
       cmp       ecx,r8d
       jae       short M01_L06
       mov       r8d,ecx
       mov       [rax+r8*4],edx
       inc       ecx
       mov       [rbp+28],ecx
       jmp       short M01_L07
M01_L06:
       lea       rcx,[rbp+20]
       call      qword ptr [7FFEA532DC48]
M01_L07:
       lea       r15d,[r15+r12+1]
       jmp       short M01_L03
M01_L08:
       xor       r15d,r15d
M01_L09:
       movsxd    rcx,r15d
       lea       rcx,[rsi+rcx*2+0C]
       mov       edx,[rsi+8]
       sub       edx,r15d
       lea       r8,[rdi+0C]
       mov       r9d,r14d
       call      qword ptr [7FFEA4E61408]
       mov       r12d,eax
       test      r12d,r12d
       jl        short M01_L12
       lea       edx,[r15+r12]
       mov       ecx,[rbp+28]
       mov       rax,[rbp+30]
       mov       r8d,[rbp+38]
       cmp       ecx,r8d
       jae       short M01_L10
       mov       r8d,ecx
       mov       [rax+r8*4],edx
       inc       ecx
       mov       [rbp+28],ecx
       jmp       short M01_L11
M01_L10:
       lea       rcx,[rbp+20]
       call      qword ptr [7FFEA532DC48]
M01_L11:
       add       r15d,r12d
       add       r15d,r14d
       jmp       short M01_L09
M01_L12:
       cmp       dword ptr [rbp+28],0
       jne       short M01_L14
       mov       rax,rsi
       mov       rcx,23C2D26E54EC
       cmp       [rbp],rcx
       je        short M01_L13
       call      CORINFO_HELP_FAIL_FAST
M01_L13:
       nop
       lea       rsp,[rbp+40]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r12
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L14:
       mov       edx,r14d
       mov       ecx,[rbp+28]
       cmp       ecx,[rbp+38]
       ja        near ptr M01_L18
       mov       r8,[rbp+30]
       mov       [rbp+8],r8
       mov       [rbp+10],ecx
       mov       rcx,rsi
       mov       r8,rbx
       lea       r9,[rbp+8]
       call      qword ptr [7FFEA49B50F0]; System.String.ReplaceHelper(Int32, System.String, System.ReadOnlySpan`1<Int32>)
       mov       rdi,rax
       mov       rsi,[rbp+20]
       test      rsi,rsi
       je        short M01_L15
       xor       ecx,ecx
       mov       [rbp+20],rcx
       mov       rcx,7FFEA4914DB8
       mov       edx,31
       call      CORINFO_HELP_CLASSINIT_SHARED_DYNAMICCLASS
       mov       rcx,22F6A407CD8
       mov       rcx,[rcx]
       mov       rdx,rsi
       xor       r8d,r8d
       cmp       [rcx],ecx
       call      qword ptr [7FFEA5335560]; System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1[[System.Int32, System.Private.CoreLib]].Return(Int32[], Boolean)
M01_L15:
       mov       rax,rdi
       mov       rcx,23C2D26E54EC
       cmp       [rbp],rcx
       je        short M01_L16
       call      CORINFO_HELP_FAIL_FAST
M01_L16:
       nop
       lea       rsp,[rbp+40]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r12
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L17:
       mov       ecx,16A1
       mov       rdx,7FFEA47F4000
       call      CORINFO_HELP_STRCNS
       mov       rdx,rax
       mov       rcx,rdi
       call      qword ptr [7FFEA49BDC78]
       int       3
M01_L18:
       call      qword ptr [7FFEA4ED3060]
       int       3
; Total bytes of code 667

System.Tests.Perf_String.Replace_Char(text: "This is a very nice sentence", oldChar: 'i', newChar: 'I')


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 22.330607657133392 > 20.635651568171316.
IsChangePoint: Marked as a change because one of 11/11/2022 5:53:56 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -19.533480701550356 (T) = (0 -22.051279089043497) / Math.Sqrt((0.04802330264672898 / (14)) + (0.36899131861666284 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.11991782255368702 = (19.69008675900985 - 22.051279089043497) / 19.69008675900985 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFBA9C050C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,28
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     ecx,di
       movzx     r8d,bx
       cmp       ecx,r8d
       je        near ptr M01_L03
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       call      qword ptr [7FFBAA1A16A8]; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       test      ebp,ebp
       jge       short M01_L00
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L00:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L04
M01_L01:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L02
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L02:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFBAA383000]; System.SpanHelpers.ReplaceValueType[[System.UInt16, System.Private.CoreLib]](UInt16 ByRef, UInt16 ByRef, UInt16, UInt16, UIntPtr)
       mov       rax,r15
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L03:
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L04:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFBAA0DFFA8]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L01
; Total bytes of code 231

Compare Jit Disasm

; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFB002E50C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,38
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     edx,di
       movzx     ecx,bx
       cmp       edx,ecx
       je        near ptr M01_L05
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       mov       [rsp+34],edx
       movzx     edx,word ptr [rsp+34]
       lea       eax,[rdx-1]
       cmp       eax,0FE
       jae       short M01_L00
       movsx     rdx,dx
       call      qword ptr [7FFB008858E8]; System.PackedSpanHelpers.IndexOf[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       jmp       short M01_L01
M01_L00:
       mov       edx,[rsp+34]
       call      qword ptr [7FFB00C1FB58]; System.SpanHelpers.NonPackedIndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
M01_L01:
       test      ebp,ebp
       jge       short M01_L02
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L02:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L06
M01_L03:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L04
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L04:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFB00A5B438]; System.SpanHelpers.ReplaceValueType[[System.UInt16, System.Private.CoreLib]](UInt16 ByRef, UInt16 ByRef, UInt16, UInt16, UIntPtr)
       mov       rax,r15
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L05:
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L06:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFB007D1888]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L03
; Total bytes of code 266

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Memory.Span<Int32>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
IndexOfAnyFourValues - Duration of single invocation 811.41 ns 893.12 ns 1.10 0.04 False
IndexOfAnyFiveValues - Duration of single invocation 857.19 ns 916.26 ns 1.07 0.08 False

graph
graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Memory.Span&lt;Int32&gt;*'

Payloads

Baseline
Compare

Histogram

System.Memory.Span<Int32>.IndexOfAnyFourValues(Size: 512)


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 893.115476054079 > 853.6086389195757.
IsChangePoint: Marked as a change because one of 10/26/2022 7:11:30 AM, 10/31/2022 10:23:25 PM, 11/11/2022 5:53:56 PM, 11/18/2022 8:48:12 PM, 12/12/2022 5:25:39 PM, 12/17/2022 10:44:50 PM, 12/21/2022 9:23:17 AM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -17.655352723675087 (T) = (0 -886.6573219555273) / Math.Sqrt((4.976405318076591 / (14)) + (550.567469208571 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.08955635836868671 = (813.7783008150718 - 886.6573219555273) / 813.7783008150718 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Int32&gt;.IndexOfAnyFiveValues(Size: 512)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 916.2596480801636 > 884.884366122159.
IsChangePoint: Marked as a change because one of 11/11/2022 5:53:56 PM, 11/18/2022 8:48:12 PM, 12/12/2022 5:25:39 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -14.792582161741155 (T) = (0 -919.5926411095774) / Math.Sqrt((234.02346260062512 / (14)) + (404.93175657466077 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.09481762636242623 = (839.9505259747775 - 919.5926411095774) / 839.9505259747775 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Author: performanceautofiler[bot]
Assignees: MihaZupan
Labels:

area-System.Runtime, untriaged

Milestone: -

@EgorBo EgorBo added tenet-performance Performance related issue tenet-performance-benchmarks Issue from performance benchmark os-windows arch-x64 labels Jan 10, 2023
@EgorBo
Copy link
Member

EgorBo commented Jan 10, 2023

cc @MihaZupan looks like regressed by #78861

@EgorBo
Copy link
Member

EgorBo commented Jan 10, 2023

Same on Linux-x64: dotnet/perf-autofiling-issues#11424
and another windows-x64: dotnet/perf-autofiling-issues#11469

@MihaZupan
Copy link
Member

I'll take a look

@MihaZupan
Copy link
Member

MihaZupan commented Jan 10, 2023

@EgorBo these ones look like they are unrelated to IndexOf changes (don't want them to slip by)

Regressions in System.Runtime.Intrinsics.Tests.Perf_Vector128Int
Regressions in System.Runtime.Intrinsics.Tests.Perf_Vector128Of<UInt32>
Regressions in System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int64>
Regressions in System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int32>
Regressions in System.Runtime.Intrinsics.Tests.Perf_Vector128Of<UInt64>
Regressions in System.Collections.Tests.Perf_BitArray
Regressions in System.Tests.Perf_HashCode
Regressions in System.Collections.CreateAddAndClear<Int32>
Regressions in PerfLabTests.CastingPerf
Regressions in PerfLabTests.CastingPerf2.CastingPerf
Regressions in Benchstone.BenchI.IniArray
Regressions in System.Collections.IterateForEach<String>
Regressions in System.Collections.AddGivenSize<Int32>
Regressions in System.Memory.Span<Int32>
Regressions in LinqBenchmarks
Regressions in System.Collections.TryGetValueFalse<Int32, Int32>

@MihaZupan
Copy link
Member

The benchmarks I believe are likely related to the IndexOf changes:

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Text.RegularExpressions.Tests.Perf_Regex_Industry_Leipzig

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
Count - Duration of single invocation 8.68 ms 11.31 ms 1.30 0.05 False

graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Text.RegularExpressions.Tests.Perf_Regex_Industry_Leipzig*'

Payloads

Baseline
Compare

Histogram

System.Text.RegularExpressions.Tests.Perf_Regex_Industry_Leipzig.Count(Pattern: "(?i)Twain", Options: None)


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 11.31371125 > 9.244280525862068.
IsChangePoint: Marked as a change because one of 10/27/2022 12:34:03 AM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -6.374166673789645 (T) = (0 -9603758.60660944) / Math.Sqrt((8648777551.858488 / (14)) + (541761443840.9534 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.09484229454698666 = (8771819.150979357 - 9603758.60660944) / 8771819.150979357 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

### Run Information
Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Tests.Perf_String

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
Replace_Char - Duration of single invocation 4.17 ns 5.58 ns 1.34 0.05 False Trace Trace
TrimEnd_CharArr - Duration of single invocation 15.10 ns 16.24 ns 1.08 0.04 False Trace Trace
Replace_Char - Duration of single invocation 4.13 ns 6.14 ns 1.49 0.04 False Trace Trace
Replace_String - Duration of single invocation 52.91 ns 56.12 ns 1.06 0.17 False Trace Trace
Replace_Char - Duration of single invocation 19.53 ns 22.33 ns 1.14 0.06 False Trace Trace

graph
graph
graph
graph
graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Tests.Perf_String*'

Payloads

Baseline
Compare

Histogram

System.Tests.Perf_String.Replace_Char(text: "This is a very nice sentence", oldChar: 'z', newChar: 'y')


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 5.5791697719305775 > 4.373588329296491.
IsChangePoint: Marked as a change because one of 11/11/2022 5:53:56 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -27.243637733037268 (T) = (0 -5.4979369389559425) / Math.Sqrt((0.00019304484897805758 / (14)) + (0.07992415633537059 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.32372669563033424 = (4.15337770032501 - 5.4979369389559425) / 4.15337770032501 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFBA9C250C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,28
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     ecx,di
       movzx     r8d,bx
       cmp       ecx,r8d
       je        near ptr M01_L03
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       call      qword ptr [7FFBAA1C16A8]; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       test      ebp,ebp
       jge       short M01_L00
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L00:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L04
M01_L01:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L02
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L02:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFBAA3A3000]
       mov       rax,r15
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L03:
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L04:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFBAA0FFFA8]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L01
; Total bytes of code 231

Compare Jit Disasm

; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFB002F50C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,38
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     edx,di
       movzx     ecx,bx
       cmp       edx,ecx
       je        near ptr M01_L05
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       mov       [rsp+34],edx
       movzx     edx,word ptr [rsp+34]
       lea       eax,[rdx-1]
       cmp       eax,0FE
       jae       short M01_L00
       movsx     rdx,dx
       call      qword ptr [7FFB008958E8]; System.PackedSpanHelpers.IndexOf[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       jmp       short M01_L01
M01_L00:
       mov       edx,[rsp+34]
       call      qword ptr [7FFB00C2FB58]; System.SpanHelpers.NonPackedIndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
M01_L01:
       test      ebp,ebp
       jge       short M01_L02
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L02:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L06
M01_L03:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L04
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L04:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFB00A6B438]
       mov       rax,r15
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L05:
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L06:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFB007E1888]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L03
; Total bytes of code 266

System.Tests.Perf_String.TrimEnd_CharArr(s: "Test ", c: [' ', ' '])


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 16.243533696179 > 15.84953257735199.
IsChangePoint: Marked as a change because one of 11/18/2022 8:48:12 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -13.227699752533349 (T) = (0 -16.421167827143552) / Math.Sqrt((0.08018990762463707 / (14)) + (0.08814426859036918 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.07970713135289936 = (15.208909296141657 - 16.421167827143552) / 15.208909296141657 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_String.TrimEnd_CharArr(System.String, Char[])
       mov       rcx,rdx
       mov       rdx,r8
       cmp       [rcx],ecx
       jmp       qword ptr [7FFCA57154F8]; System.String.TrimEnd(Char[])
; Total bytes of code 14
; System.String.TrimEnd(Char[])
       sub       rsp,28
       xor       eax,eax
       mov       [rsp+20],rax
       test      rdx,rdx
       je        short M01_L00
       mov       r8d,[rdx+8]
       test      r8d,r8d
       je        short M01_L00
       add       rdx,10
       mov       [rsp+20],rdx
       mov       rdx,[rsp+20]
       mov       r9d,2
       call      qword ptr [7FFCA5715528]; System.String.TrimHelper(Char*, Int32, System.Text.TrimType)
       nop
       add       rsp,28
       ret
M01_L00:
       mov       edx,2
       call      qword ptr [7FFCA5715510]
       nop
       add       rsp,28
       ret
; Total bytes of code 74

Compare Jit Disasm

; System.Tests.Perf_String.TrimEnd_CharArr(System.String, Char[])
       mov       rcx,rdx
       mov       rdx,r8
       cmp       [rcx],ecx
       jmp       qword ptr [7FFEA49954F8]; System.String.TrimEnd(Char[])
; Total bytes of code 14
; System.String.TrimEnd(Char[])
       sub       rsp,28
       xor       eax,eax
       mov       [rsp+20],rax
       test      rdx,rdx
       je        short M01_L00
       mov       r8d,[rdx+8]
       test      r8d,r8d
       je        short M01_L00
       add       rdx,10
       mov       [rsp+20],rdx
       mov       rdx,[rsp+20]
       mov       r9d,2
       call      qword ptr [7FFEA4995528]; System.String.TrimHelper(Char*, Int32, System.Text.TrimType)
       nop
       add       rsp,28
       ret
M01_L00:
       mov       edx,2
       call      qword ptr [7FFEA4995510]
       nop
       add       rsp,28
       ret
; Total bytes of code 74

System.Tests.Perf_String.Replace_Char(text: "Hello", oldChar: 'a', newChar: 'b')


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 6.141896447049398 > 4.345308369149102.
IsChangePoint: Marked as a change because one of 10/25/2022 2:34:53 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -77.67081568675944 (T) = (0 -6.195133441371548) / Math.Sqrt((0.000163412449150792 / (14)) + (0.02276838353402995 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.4972135604471777 = (4.137775401607522 - 6.195133441371548) / 4.137775401607522 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFBA9C550C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,28
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     ecx,di
       movzx     r8d,bx
       cmp       ecx,r8d
       je        near ptr M01_L03
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       call      qword ptr [7FFBAA1F16A8]; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       test      ebp,ebp
       jge       short M01_L00
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L00:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L04
M01_L01:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L02
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L02:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFBAA3D3000]
       mov       rax,r15
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L03:
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L04:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFBAA12FFA8]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L01
; Total bytes of code 231

Compare Jit Disasm

; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFB003350C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,38
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     edx,di
       movzx     ecx,bx
       cmp       edx,ecx
       je        near ptr M01_L05
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       mov       [rsp+34],edx
       movzx     edx,word ptr [rsp+34]
       lea       eax,[rdx-1]
       cmp       eax,0FE
       jae       short M01_L00
       movsx     rdx,dx
       call      qword ptr [7FFB008D58E8]; System.PackedSpanHelpers.IndexOf[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       jmp       short M01_L01
M01_L00:
       mov       edx,[rsp+34]
       call      qword ptr [7FFB00C6FB58]; System.SpanHelpers.NonPackedIndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
M01_L01:
       test      ebp,ebp
       jge       short M01_L02
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L02:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L06
M01_L03:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L04
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L04:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFB00AAB438]
       mov       rax,r15
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L05:
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L06:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFB00821888]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L03
; Total bytes of code 266

System.Tests.Perf_String.Replace_String(text: "This is a very nice sentence. This is another very nice sentence.", oldValue: "a", newValue: "")


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 56.12304519478277 > 55.71160747100109.
IsChangePoint: Marked as a change because one of 11/17/2022 7:01:39 PM, 11/18/2022 3:21:53 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -5.791124591809122 (T) = (0 -56.58363624443871) / Math.Sqrt((2.1664145734713496 / (14)) + (2.5689714504370484 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.05192214047934187 = (53.790707569530355 - 56.58363624443871) / 53.790707569530355 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_String.Replace_String(System.String, System.String, System.String)
       mov       rcx,rdx
       mov       rdx,r8
       mov       r8,r9
       cmp       [rcx],ecx
       jmp       qword ptr [7FFCE0E250D8]; System.String.Replace(System.String, System.String)
; Total bytes of code 17
; System.String.Replace(System.String, System.String)
       push      rbp
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbx
       sub       rsp,58
       lea       rbp,[rsp+20]
       xor       eax,eax
       mov       [rbp+8],rax
       vxorps    xmm4,xmm4,xmm4
       vmovdqa   xmmword ptr [rbp+10],xmm4
       vmovdqa   xmmword ptr [rbp+20],xmm4
       mov       [rbp+30],rax
       mov       rax,0C6A9C64BB2F3
       mov       [rbp],rax
       mov       rsi,rcx
       mov       rdi,rdx
       mov       rbx,r8
       test      rdi,rdi
       je        near ptr M01_L15
       mov       r14d,[rdi+8]
       test      r14d,r14d
       je        near ptr M01_L15
       test      rbx,rbx
       jne       short M01_L00
       mov       rbx,7FFCE0EC0008
M01_L00:
       test      [rsp],esp
       sub       rsp,200
       lea       rdx,[rsp+20]
       mov       [rbp+28],rdx
       mov       dword ptr [rbp+30],80
       xor       edx,edx
       mov       [rbp+18],rdx
       mov       [rbp+20],edx
       cmp       r14d,1
       jne       near ptr M01_L06
       cmp       dword ptr [rbx+8],1
       jne       short M01_L02
       movzx     edx,word ptr [rdi+0C]
       movzx     r8d,word ptr [rbx+0C]
       mov       rcx,rsi
       call      qword ptr [7FFCE0E250C0]; System.String.Replace(Char, Char)
       mov       rcx,0C6A9C64BB2F3
       cmp       [rbp],rcx
       je        short M01_L01
       call      CORINFO_HELP_FAIL_FAST
M01_L01:
       nop
       lea       rsp,[rbp+38]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L02:
       movzx     edi,word ptr [rdi+0C]
       xor       r15d,r15d
M01_L03:
       movsxd    rcx,r15d
       lea       rcx,[rsi+rcx*2+0C]
       mov       r8d,[rsi+8]
       sub       r8d,r15d
       movsx     rdx,di
       call      qword ptr [7FFCE13C16A8]; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       test      eax,eax
       jl        near ptr M01_L10
       add       r15d,eax
       mov       edx,r15d
       mov       ecx,[rbp+20]
       mov       rax,[rbp+28]
       mov       r8d,[rbp+30]
       cmp       ecx,r8d
       jae       short M01_L04
       mov       r8d,ecx
       mov       [rax+r8*4],edx
       inc       ecx
       mov       [rbp+20],ecx
       jmp       short M01_L05
M01_L04:
       lea       rcx,[rbp+18]
       call      qword ptr [7FFCE17ABC30]
M01_L05:
       inc       r15d
       jmp       short M01_L03
M01_L06:
       xor       r15d,r15d
M01_L07:
       movsxd    rcx,r15d
       lea       rcx,[rsi+rcx*2+0C]
       mov       edx,[rsi+8]
       sub       edx,r15d
       lea       r8,[rdi+0C]
       mov       r9d,r14d
       call      qword ptr [7FFCE12D1408]
       test      eax,eax
       jl        short M01_L10
       add       r15d,eax
       mov       edx,r15d
       mov       ecx,[rbp+20]
       mov       rax,[rbp+28]
       mov       r8d,[rbp+30]
       cmp       ecx,r8d
       jae       short M01_L08
       mov       r8d,ecx
       mov       [rax+r8*4],edx
       inc       ecx
       mov       [rbp+20],ecx
       jmp       short M01_L09
M01_L08:
       lea       rcx,[rbp+18]
       call      qword ptr [7FFCE17ABC30]
M01_L09:
       add       r15d,r14d
       jmp       short M01_L07
M01_L10:
       cmp       dword ptr [rbp+20],0
       jne       short M01_L12
       mov       rax,rsi
       mov       rcx,0C6A9C64BB2F3
       cmp       [rbp],rcx
       je        short M01_L11
       call      CORINFO_HELP_FAIL_FAST
M01_L11:
       nop
       lea       rsp,[rbp+38]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L12:
       mov       edx,r14d
       mov       ecx,[rbp+20]
       cmp       ecx,[rbp+30]
       ja        near ptr M01_L16
       mov       r8,[rbp+28]
       mov       [rbp+8],r8
       mov       [rbp+10],ecx
       mov       rcx,rsi
       mov       r8,rbx
       lea       r9,[rbp+8]
       call      qword ptr [7FFCE0E250F0]; System.String.ReplaceHelper(Int32, System.String, System.ReadOnlySpan`1<Int32>)
       mov       rdi,rax
       mov       rsi,[rbp+18]
       test      rsi,rsi
       je        short M01_L13
       xor       ecx,ecx
       mov       [rbp+18],rcx
       mov       rcx,7FFCE0D84D68
       mov       edx,31
       call      CORINFO_HELP_CLASSINIT_SHARED_DYNAMICCLASS
       mov       rcx,1A6AE807CD0
       mov       rcx,[rcx]
       mov       rdx,rsi
       xor       r8d,r8d
       cmp       [rcx],ecx
       call      qword ptr [7FFCE1799680]; System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1[[System.Int32, System.Private.CoreLib]].Return(Int32[], Boolean)
M01_L13:
       mov       rax,rdi
       mov       rcx,0C6A9C64BB2F3
       cmp       [rbp],rcx
       je        short M01_L14
       call      CORINFO_HELP_FAIL_FAST
M01_L14:
       nop
       lea       rsp,[rbp+38]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L15:
       mov       ecx,16A1
       mov       rdx,7FFCE0C64000
       call      CORINFO_HELP_STRCNS
       mov       rdx,rax
       mov       rcx,rdi
       call      qword ptr [7FFCE0E2DC78]
       int       3
M01_L16:
       call      qword ptr [7FFCE15734E0]
       int       3
; Total bytes of code 610

Compare Jit Disasm

; System.Tests.Perf_String.Replace_String(System.String, System.String, System.String)
       mov       rcx,rdx
       mov       rdx,r8
       mov       r8,r9
       cmp       [rcx],ecx
       jmp       qword ptr [7FFEA49B50D8]; System.String.Replace(System.String, System.String)
; Total bytes of code 17
; System.String.Replace(System.String, System.String)
       push      rbp
       push      r15
       push      r14
       push      r12
       push      rdi
       push      rsi
       push      rbx
       sub       rsp,60
       lea       rbp,[rsp+20]
       xor       eax,eax
       mov       [rbp+8],rax
       vxorps    xmm4,xmm4,xmm4
       vmovdqa   xmmword ptr [rbp+10],xmm4
       vmovdqa   xmmword ptr [rbp+20],xmm4
       vmovdqa   xmmword ptr [rbp+30],xmm4
       mov       rax,23C2D26E54EC
       mov       [rbp],rax
       mov       rsi,rcx
       mov       rdi,rdx
       mov       rbx,r8
       test      rdi,rdi
       je        near ptr M01_L17
       mov       r14d,[rdi+8]
       test      r14d,r14d
       je        near ptr M01_L17
       test      rbx,rbx
       jne       short M01_L00
       mov       rbx,7FFEA4A50008
M01_L00:
       test      [rsp],esp
       sub       rsp,200
       lea       rdx,[rsp+20]
       mov       [rbp+30],rdx
       mov       dword ptr [rbp+38],80
       xor       edx,edx
       mov       [rbp+20],rdx
       mov       [rbp+28],edx
       cmp       r14d,1
       jne       near ptr M01_L08
       cmp       dword ptr [rbx+8],1
       jne       short M01_L02
       movzx     edx,word ptr [rdi+0C]
       movzx     r8d,word ptr [rbx+0C]
       mov       rcx,rsi
       call      qword ptr [7FFEA49B50C0]; System.String.Replace(Char, Char)
       mov       rcx,23C2D26E54EC
       cmp       [rbp],rcx
       je        short M01_L01
       call      CORINFO_HELP_FAIL_FAST
M01_L01:
       nop
       lea       rsp,[rbp+40]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r12
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L02:
       movzx     edi,word ptr [rdi+0C]
       xor       r15d,r15d
M01_L03:
       movsxd    rdx,r15d
       lea       rcx,[rsi+rdx*2+0C]
       mov       r8d,[rsi+8]
       sub       r8d,r15d
       movsx     rdx,di
       mov       [rbp+1C],edx
       movzx     edx,word ptr [rbp+1C]
       dec       edx
       cmp       edx,0FE
       jae       short M01_L04
       movzx     edx,word ptr [rbp+1C]
       movsx     rdx,dx
       call      qword ptr [7FFEA4F558E8]; System.PackedSpanHelpers.IndexOf[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       r12d,eax
       jmp       short M01_L05
M01_L04:
       mov       edx,[rbp+1C]
       call      qword ptr [7FFEA52EFB58]; System.SpanHelpers.NonPackedIndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       r12d,eax
M01_L05:
       test      r12d,r12d
       jl        near ptr M01_L12
       lea       edx,[r15+r12]
       mov       ecx,[rbp+28]
       mov       rax,[rbp+30]
       mov       r8d,[rbp+38]
       cmp       ecx,r8d
       jae       short M01_L06
       mov       r8d,ecx
       mov       [rax+r8*4],edx
       inc       ecx
       mov       [rbp+28],ecx
       jmp       short M01_L07
M01_L06:
       lea       rcx,[rbp+20]
       call      qword ptr [7FFEA532DC48]
M01_L07:
       lea       r15d,[r15+r12+1]
       jmp       short M01_L03
M01_L08:
       xor       r15d,r15d
M01_L09:
       movsxd    rcx,r15d
       lea       rcx,[rsi+rcx*2+0C]
       mov       edx,[rsi+8]
       sub       edx,r15d
       lea       r8,[rdi+0C]
       mov       r9d,r14d
       call      qword ptr [7FFEA4E61408]
       mov       r12d,eax
       test      r12d,r12d
       jl        short M01_L12
       lea       edx,[r15+r12]
       mov       ecx,[rbp+28]
       mov       rax,[rbp+30]
       mov       r8d,[rbp+38]
       cmp       ecx,r8d
       jae       short M01_L10
       mov       r8d,ecx
       mov       [rax+r8*4],edx
       inc       ecx
       mov       [rbp+28],ecx
       jmp       short M01_L11
M01_L10:
       lea       rcx,[rbp+20]
       call      qword ptr [7FFEA532DC48]
M01_L11:
       add       r15d,r12d
       add       r15d,r14d
       jmp       short M01_L09
M01_L12:
       cmp       dword ptr [rbp+28],0
       jne       short M01_L14
       mov       rax,rsi
       mov       rcx,23C2D26E54EC
       cmp       [rbp],rcx
       je        short M01_L13
       call      CORINFO_HELP_FAIL_FAST
M01_L13:
       nop
       lea       rsp,[rbp+40]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r12
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L14:
       mov       edx,r14d
       mov       ecx,[rbp+28]
       cmp       ecx,[rbp+38]
       ja        near ptr M01_L18
       mov       r8,[rbp+30]
       mov       [rbp+8],r8
       mov       [rbp+10],ecx
       mov       rcx,rsi
       mov       r8,rbx
       lea       r9,[rbp+8]
       call      qword ptr [7FFEA49B50F0]; System.String.ReplaceHelper(Int32, System.String, System.ReadOnlySpan`1<Int32>)
       mov       rdi,rax
       mov       rsi,[rbp+20]
       test      rsi,rsi
       je        short M01_L15
       xor       ecx,ecx
       mov       [rbp+20],rcx
       mov       rcx,7FFEA4914DB8
       mov       edx,31
       call      CORINFO_HELP_CLASSINIT_SHARED_DYNAMICCLASS
       mov       rcx,22F6A407CD8
       mov       rcx,[rcx]
       mov       rdx,rsi
       xor       r8d,r8d
       cmp       [rcx],ecx
       call      qword ptr [7FFEA5335560]; System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1[[System.Int32, System.Private.CoreLib]].Return(Int32[], Boolean)
M01_L15:
       mov       rax,rdi
       mov       rcx,23C2D26E54EC
       cmp       [rbp],rcx
       je        short M01_L16
       call      CORINFO_HELP_FAIL_FAST
M01_L16:
       nop
       lea       rsp,[rbp+40]
       pop       rbx
       pop       rsi
       pop       rdi
       pop       r12
       pop       r14
       pop       r15
       pop       rbp
       ret
M01_L17:
       mov       ecx,16A1
       mov       rdx,7FFEA47F4000
       call      CORINFO_HELP_STRCNS
       mov       rdx,rax
       mov       rcx,rdi
       call      qword ptr [7FFEA49BDC78]
       int       3
M01_L18:
       call      qword ptr [7FFEA4ED3060]
       int       3
; Total bytes of code 667

System.Tests.Perf_String.Replace_Char(text: "This is a very nice sentence", oldChar: 'i', newChar: 'I')


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 22.330607657133392 > 20.635651568171316.
IsChangePoint: Marked as a change because one of 11/11/2022 5:53:56 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -19.533480701550356 (T) = (0 -22.051279089043497) / Math.Sqrt((0.04802330264672898 / (14)) + (0.36899131861666284 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.11991782255368702 = (19.69008675900985 - 22.051279089043497) / 19.69008675900985 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFBA9C050C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,28
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     ecx,di
       movzx     r8d,bx
       cmp       ecx,r8d
       je        near ptr M01_L03
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       call      qword ptr [7FFBAA1A16A8]; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       test      ebp,ebp
       jge       short M01_L00
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L00:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L04
M01_L01:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L02
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L02:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFBAA383000]; System.SpanHelpers.ReplaceValueType[[System.UInt16, System.Private.CoreLib]](UInt16 ByRef, UInt16 ByRef, UInt16, UInt16, UIntPtr)
       mov       rax,r15
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L03:
       mov       rax,rsi
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L04:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFBAA0DFFA8]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L01
; Total bytes of code 231

Compare Jit Disasm

; System.Tests.Perf_String.Replace_Char(System.String, Char, Char)
       mov       rcx,rdx
       mov       edx,r8d
       movzx     r8d,r9w
       movzx     edx,dx
       cmp       [rcx],ecx
       jmp       qword ptr [7FFB002E50C0]; System.String.Replace(Char, Char)
; Total bytes of code 21
; System.String.Replace(Char, Char)
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,38
       mov       rsi,rcx
       mov       edi,edx
       mov       ebx,r8d
       movzx     edx,di
       movzx     ecx,bx
       cmp       edx,ecx
       je        near ptr M01_L05
       lea       rcx,[rsi+0C]
       mov       r8d,[rsi+8]
       movsx     rdx,di
       mov       [rsp+34],edx
       movzx     edx,word ptr [rsp+34]
       lea       eax,[rdx-1]
       cmp       eax,0FE
       jae       short M01_L00
       movsx     rdx,dx
       call      qword ptr [7FFB008858E8]; System.PackedSpanHelpers.IndexOf[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
       jmp       short M01_L01
M01_L00:
       mov       edx,[rsp+34]
       call      qword ptr [7FFB00C1FB58]; System.SpanHelpers.NonPackedIndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       mov       ebp,eax
M01_L01:
       test      ebp,ebp
       jge       short M01_L02
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L02:
       mov       ecx,[rsi+8]
       sub       ecx,ebp
       mov       r14d,ecx
       mov       ecx,[rsi+8]
       call      System.String.FastAllocateString(Int32)
       mov       r15,rax
       test      ebp,ebp
       jg        short M01_L06
M01_L03:
       mov       r8d,ebp
       lea       rcx,[rsi+r8*2+0C]
       cmp       [r15],r15b
       mov       r8d,ebp
       lea       rdx,[r15+r8*2+0C]
       mov       r8d,[rsi+8]
       cmp       r8,8
       jb        short M01_L04
       sub       r8,r14
       and       r8,7
       lea       r9,[r8+r8]
       sub       rcx,r9
       lea       r9,[r8+r8]
       sub       rdx,r9
       add       r14,r8
M01_L04:
       mov       [rsp+20],r14
       movzx     r8d,di
       movzx     r9d,bx
       call      qword ptr [7FFB00A5B438]; System.SpanHelpers.ReplaceValueType[[System.UInt16, System.Private.CoreLib]](UInt16 ByRef, UInt16 ByRef, UInt16, UInt16, UIntPtr)
       mov       rax,r15
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L05:
       mov       rax,rsi
       add       rsp,38
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L06:
       cmp       [r15],r15b
       lea       rcx,[r15+0C]
       lea       rdx,[rsi+0C]
       mov       r8d,ebp
       add       r8,r8
       call      qword ptr [7FFB007D1888]; System.Buffer.Memmove(Byte ByRef, Byte ByRef, UIntPtr)
       jmp       near ptr M01_L03
; Total bytes of code 266

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Memory.Span<Byte>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
IndexOfAnyThreeValues - Duration of single invocation 4.31 ns 6.69 ns 1.55 0.29 False
IndexOfAnyTwoValues - Duration of single invocation 9.33 ns 12.06 ns 1.29 0.12 False
IndexOfValue - Duration of single invocation 7.81 ns 10.14 ns 1.30 0.08 False

graph
graph
graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Memory.Span&lt;Byte&gt;*'

Payloads

Baseline
Compare

Histogram

System.Memory.Span<Byte>.IndexOfAnyThreeValues(Size: 33)


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 6.688401220331571 > 4.52985451911958.
IsChangePoint: Marked as a change because one of 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -10.015251719308925 (T) = (0 -5.2759171980532145) / Math.Sqrt((0.04174260868664971 / (14)) + (0.17256315135999023 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.2077457729310386 = (4.368400466638988 - 5.2759171980532145) / 4.368400466638988 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Byte&gt;.IndexOfAnyTwoValues(Size: 512)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 12.063570521259576 > 9.947021985001589.
IsChangePoint: Marked as a change because one of 12/1/2022 11:48:13 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -60.11481624230292 (T) = (0 -11.923158120052507) / Math.Sqrt((0.0039112758617871534 / (14)) + (0.045440894065887555 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.2581721885519771 = (9.476571035777543 - 11.923158120052507) / 9.476571035777543 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Byte&gt;.IndexOfValue(Size: 512)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 10.143601132280713 > 8.118807718793475.
IsChangePoint: Marked as a change because one of 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -126.69726735711315 (T) = (0 -10.129929934999833) / Math.Sqrt((0.0045761415398686825 / (14)) + (0.0009524343613679088 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.30872219100193726 = (7.740321058699644 - 10.129929934999833) / 7.740321058699644 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in System.Memory.Span<Char>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
SequenceEqual - Duration of single invocation 21.30 ns 23.89 ns 1.12 0.06 False
IndexOfAnyThreeValues - Duration of single invocation 6.54 ns 8.36 ns 1.28 0.21 False
IndexOfAnyThreeValues - Duration of single invocation 4.21 ns 5.62 ns 1.33 0.23 False
IndexOfAnyTwoValues - Duration of single invocation 4.59 ns 6.86 ns 1.49 0.18 False
IndexOfAnyTwoValues - Duration of single invocation 18.52 ns 21.25 ns 1.15 0.10 False
IndexOfValue - Duration of single invocation 14.56 ns 17.32 ns 1.19 0.05 False
IndexOfValue - Duration of single invocation 2.53 ns 4.50 ns 1.78 0.11 False
IndexOfAnyTwoValues - Duration of single invocation 3.05 ns 4.11 ns 1.34 0.13 False
SequenceEqual - Duration of single invocation 3.74 ns 4.76 ns 1.27 0.17 False

graph
graph
graph
graph
graph
graph
graph
graph
graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Memory.Span&lt;Char&gt;*'

Payloads

Baseline
Compare

Histogram

System.Memory.Span<Char>.SequenceEqual(Size: 512)


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 23.89232426388415 > 22.81718387164758.
IsChangePoint: Marked as a change because one of 10/31/2022 10:23:25 PM, 11/11/2022 5:53:56 PM, 11/18/2022 8:48:12 PM, 12/12/2022 5:25:39 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -13.991794490003649 (T) = (0 -23.49421288545805) / Math.Sqrt((0.06742729453116522 / (14)) + (0.4352512651219854 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.08685367741942551 = (21.61672115904471 - 23.49421288545805) / 21.61672115904471 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Char&gt;.IndexOfAnyThreeValues(Size: 33)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 8.362037039485658 > 6.887225383417874.
IsChangePoint: Marked as a change because one of 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -16.232757765556215 (T) = (0 -8.420345449779816) / Math.Sqrt((0.11809462645233709 / (14)) + (0.0942116987273042 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.2576078113498619 = (6.695525722555573 - 8.420345449779816) / 6.695525722555573 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Char&gt;.IndexOfAnyThreeValues(Size: 4)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 5.61694936385416 > 4.420162372928747.
IsChangePoint: Marked as a change because one of 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -21.82780545291282 (T) = (0 -5.737344761334258) / Math.Sqrt((0.026766220908033142 / (14)) + (0.0778907113497045 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.330974487819211 = (4.310634661927174 - 5.737344761334258) / 4.310634661927174 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Char&gt;.IndexOfAnyTwoValues(Size: 33)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 6.856226941170559 > 4.82911508443263.
IsChangePoint: Marked as a change because one of 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -18.05800793214548 (T) = (0 -6.391478865035926) / Math.Sqrt((0.11956572146488756 / (14)) + (0.0076965617780046505 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.3598813616736624 = (4.700026814963967 - 6.391478865035926) / 4.700026814963967 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Char&gt;.IndexOfAnyTwoValues(Size: 512)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 21.254483014663837 > 19.477601929274524.
IsChangePoint: Marked as a change because one of 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -43.540255422241586 (T) = (0 -21.733506099046902) / Math.Sqrt((0.05404952535933209 / (14)) + (0.03794709985847532 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.16524262434501763 = (18.651485660562148 - 21.733506099046902) / 18.651485660562148 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Char&gt;.IndexOfValue(Size: 512)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 17.324904427767446 > 15.280021847021812.
IsChangePoint: Marked as a change because one of 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -23.52948767848823 (T) = (0 -17.203725082208116) / Math.Sqrt((0.11032984326763888 / (14)) + (0.09621700605609833 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.16565248259128587 = (14.758879974212931 - 17.203725082208116) / 14.758879974212931 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Char&gt;.IndexOfValue(Size: 4)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 4.497107310649779 > 2.658433388491175.
IsChangePoint: Marked as a change because one of 12/17/2022 10:44:50 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -8.845105388192739 (T) = (0 -3.0548220918007596) / Math.Sqrt((0.0008594913925675681 / (14)) + (0.1091590999062429 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.2020203534956602 = (2.541406293925778 - 3.0548220918007596) / 2.541406293925778 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Char&gt;.IndexOfAnyTwoValues(Size: 4)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 4.106750152298499 > 3.1934732800910295.
IsChangePoint: Marked as a change because one of 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -37.11897981020811 (T) = (0 -4.134283669955344) / Math.Sqrt((1.0907724841934129E-05 / (14)) + (0.0285397092664857 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.3589821466802544 = (3.0421913047604376 - 4.134283669955344) / 3.0421913047604376 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```#### System.Memory.Span&lt;Char&gt;.SequenceEqual(Size: 33)

```log

Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 4.76043246787451 > 3.9542257437301447.
IsChangePoint: Marked as a change because one of 12/12/2022 5:25:39 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -17.985021526133206 (T) = (0 -4.7092082511176905) / Math.Sqrt((0.0014354965136032087 / (14)) + (0.08696391246476293 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.24973707336960635 = (3.768159200415234 - 4.7092082511176905) / 3.768159200415234 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Run Information

Architecture x64
OS Windows 10.0.18362
Baseline ee6de921299d1b86a02d9049b9c8dd164cab1401
Compare 7fa0d5b5942f138c362f2753398b4a8d4f71eb73
Diff Diff

Regressions in Microsoft.Extensions.Primitives.StringSegmentBenchmark

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
IndexOfAny - Duration of single invocation 6.79 ns 8.14 ns 1.20 0.05 False 90.6044626150156 109.59676837810011 1.2096177739476706 Trace Trace
IndexOf - Duration of single invocation 4.03 ns 5.94 ns 1.47 0.03 False 69.72380677253331 67.67989115692451 0.9706855418511949 Trace Trace

graph
graph
Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'Microsoft.Extensions.Primitives.StringSegmentBenchmark*'

Payloads

Baseline
Compare

Histogram

Microsoft.Extensions.Primitives.StringSegmentBenchmark.IndexOfAny


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 8.141592639882667 > 7.103631515435954.
IsChangePoint: Marked as a change because one of 11/4/2022 4:27:34 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -60.35943057253968 (T) = (0 -8.138337026326202) / Math.Sqrt((5.3581953463393844E-05 / (14)) + (0.016896701545868902 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.2025732555281851 = (6.76743557110934 - 8.138337026326202) / 6.76743557110934 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; Microsoft.Extensions.Primitives.StringSegmentBenchmark.IndexOfAny()
       push      rsi
       sub       rsp,20
       lea       rsi,[rcx+38]
       mov       rdx,[rcx+10]
       mov       eax,0FFFFFFFF
       mov       rcx,[rsi]
       test      rcx,rcx
       je        short M00_L00
       mov       r8d,[rsi+0C]
       test      r8d,r8d
       je        short M00_L01
       dec       r8d
       cmp       r8d,7
       jb        short M00_L02
       mov       r8d,[rsi+8]
       inc       r8d
       mov       r9d,7
       cmp       [rcx],ecx
       call      qword ptr [7FF9AB395660]; System.String.IndexOfAny(Char[], Int32, Int32)
       cmp       eax,0FFFFFFFF
       je        short M00_L00
       sub       eax,[rsi+8]
M00_L00:
       add       rsp,20
       pop       rsi
       ret
M00_L01:
       mov       ecx,4
       call      qword ptr [7FF9ABD17018]
       int       3
M00_L02:
       mov       ecx,5
       call      qword ptr [7FF9ABD17018]
       int       3
; Total bytes of code 103
; System.String.IndexOfAny(Char[], Int32, Int32)
       push      rsi
       sub       rsp,40
       mov       esi,r8d
M01_L00:
       test      rdx,rdx
       je        near ptr M01_L04
       mov       r8d,[rcx+8]
       cmp       r8d,esi
       jb        near ptr M01_L05
       sub       r8d,esi
       cmp       r8d,r9d
       jb        near ptr M01_L06
       movsxd    r8,esi
       lea       rcx,[rcx+r8*2+0C]
       lea       r8,[rdx+10]
       mov       edx,[rdx+8]
       mov       [rsp+3C],edx
       cmp       edx,5
       ja        near ptr M01_L01
       mov       edx,[rsp+3C]
       lea       rax,[7FF9AB3D3A00]
       mov       eax,[rax+rdx*4]
       lea       r10,[M01_L00]
       add       rax,r10
       jmp       rax
       mov       eax,0FFFFFFFF
       jmp       near ptr M01_L02
       movsx     rdx,word ptr [r8]
       mov       r8d,r9d
       call      qword ptr [7FF9AB9316A8]; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       jmp       near ptr M01_L02
       movsx     rdx,word ptr [r8]
       movsx     r8,word ptr [r8+2]
       call      qword ptr [7FF9ABAEB930]; System.SpanHelpers.IndexOfAnyValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int16, Int32)
       jmp       near ptr M01_L02
       movsx     rdx,word ptr [r8]
       movsx     rax,word ptr [r8+2]
       movsx     r10,word ptr [r8+4]
       mov       [rsp+20],r9d
       mov       r8d,eax
       mov       r9d,r10d
       call      qword ptr [7FF9ABBBD7E0]; System.SpanHelpers.IndexOfAnyValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int16, Int16, Int32)
       jmp       short M01_L02
       movsx     rdx,word ptr [r8]
       movsx     rax,word ptr [r8+2]
       movsx     r10,word ptr [r8+4]
       movsx     r8,word ptr [r8+6]
       mov       [rsp+20],r8d
       mov       [rsp+28],r9d
       mov       r8d,eax
       mov       r9d,r10d
       call      qword ptr [7FF9ABD41EE8]
       jmp       short M01_L02
       movsx     rdx,word ptr [r8]
       movsx     rax,word ptr [r8+2]
       movsx     r10,word ptr [r8+4]
       movsx     r11,word ptr [r8+6]
       movsx     r8,word ptr [r8+8]
       mov       [rsp+20],r11d
       mov       [rsp+28],r8d
       mov       [rsp+30],r9d
       mov       r8d,eax
       mov       r9d,r10d
       call      qword ptr [7FF9ABD43720]
       jmp       short M01_L02
M01_L01:
       mov       edx,r9d
       mov       r9d,[rsp+3C]
       call      qword ptr [7FF9ABD43F90]
M01_L02:
       test      eax,eax
       jge       short M01_L03
       add       rsp,40
       pop       rsi
       ret
M01_L03:
       add       eax,esi
       add       rsp,40
       pop       rsi
       ret
M01_L04:
       mov       ecx,60
       call      qword ptr [7FF9ABAE37F8]
       int       3
M01_L05:
       mov       ecx,8
       xor       edx,edx
       call      qword ptr [7FF9ABAE3840]
       int       3
M01_L06:
       mov       ecx,1B
       mov       edx,4
       call      qword ptr [7FF9ABAE3840]
       int       3
; Total bytes of code 348

Compare Jit Disasm

; Microsoft.Extensions.Primitives.StringSegmentBenchmark.IndexOfAny()
       push      rsi
       sub       rsp,20
       lea       rsi,[rcx+38]
       mov       rdx,[rcx+10]
       mov       eax,0FFFFFFFF
       mov       rcx,[rsi]
       test      rcx,rcx
       je        short M00_L00
       mov       r8d,[rsi+0C]
       test      r8d,r8d
       je        short M00_L01
       dec       r8d
       cmp       r8d,7
       jb        short M00_L02
       mov       r8d,[rsi+8]
       inc       r8d
       mov       r9d,7
       cmp       [rcx],ecx
       call      qword ptr [7FFCF2F45660]; System.String.IndexOfAny(Char[], Int32, Int32)
       cmp       eax,0FFFFFFFF
       je        short M00_L00
       sub       eax,[rsi+8]
M00_L00:
       add       rsp,20
       pop       rsi
       ret
M00_L01:
       mov       ecx,4
       call      qword ptr [7FFCF38B7018]
       int       3
M00_L02:
       mov       ecx,5
       call      qword ptr [7FFCF38B7018]
       int       3
; Total bytes of code 103
; System.String.IndexOfAny(Char[], Int32, Int32)
       push      rdi
       push      rsi
       push      rbx
       sub       rsp,50
       mov       esi,r8d
M01_L00:
       test      rdx,rdx
       je        near ptr M01_L10
       cmp       [rcx+8],esi
       jb        near ptr M01_L11
       mov       r8d,[rcx+8]
       sub       r8d,esi
       cmp       r8d,r9d
       jb        near ptr M01_L12
       movsxd    r8,esi
       lea       rcx,[rcx+r8*2+0C]
       lea       r8,[rdx+10]
       mov       edx,[rdx+8]
       mov       eax,r9d
       mov       r9d,edx
       cmp       r9d,5
       ja        near ptr M01_L07
       mov       edx,r9d
       lea       r9,[7FFCF2F85E98]
       mov       r9d,[r9+rdx*4]
       lea       r10,[M01_L00]
       add       r9,r10
       jmp       r9
       mov       eax,0FFFFFFFF
       jmp       near ptr M01_L08
       movsx     rdx,word ptr [r8]
       movsx     rdx,dx
       mov       [rsp+4C],edx
       movzx     edi,word ptr [rsp+4C]
       lea       edx,[rdi-1]
       cmp       edx,0FE
       jae       short M01_L01
       movsx     rdx,di
       mov       r8d,eax
       call      qword ptr [7FFCF34E58E8]
       jmp       short M01_L02
M01_L01:
       mov       edx,[rsp+4C]
       mov       r8d,eax
       call      qword ptr [7FFCF387DB58]; System.SpanHelpers.NonPackedIndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
M01_L02:
       jmp       near ptr M01_L08
       movsx     rdx,word ptr [r8]
       movsx     r8,word ptr [r8+2]
       mov       r9d,eax
       movsx     rdx,dx
       mov       [rsp+48],edx
       movsx     r8,r8w
       mov       [rsp+44],r8d
       movzx     edi,word ptr [rsp+48]
       lea       r8d,[rdi-1]
       cmp       r8d,0FE
       jae       short M01_L03
       movzx     ebx,word ptr [rsp+44]
       lea       r8d,[rbx-1]
       cmp       r8d,0FE
       jae       short M01_L03
       mov       edx,edi
       movsx     r8,bx
       movsx     rdx,dx
       call      qword ptr [7FFCF36B5E28]; System.PackedSpanHelpers.IndexOfAny[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int16, Int32)
       jmp       short M01_L04
M01_L03:
       mov       edx,[rsp+48]
       mov       r8d,[rsp+44]
       call      qword ptr [7FFCF38F3ED0]
M01_L04:
       jmp       near ptr M01_L08
       movsx     r9,word ptr [r8]
       movsx     rdx,word ptr [r8+2]
       movsx     r8,word ptr [r8+4]
       movsx     r9,r9w
       mov       [rsp+40],r9d
       movsx     r9,dx
       mov       [rsp+3C],r9d
       movsx     r9,r8w
       mov       [rsp+38],r9d
       movzx     edi,word ptr [rsp+40]
       lea       r9d,[rdi-1]
       cmp       r9d,0FE
       jae       short M01_L05
       movzx     ebx,word ptr [rsp+3C]
       lea       r9d,[rbx-1]
       cmp       r9d,0FE
       jae       short M01_L05
       movzx     r9d,word ptr [rsp+38]
       lea       edx,[r9-1]
       cmp       edx,0FE
       jae       short M01_L05
       mov       edx,edi
       mov       r8d,ebx
       mov       [rsp+20],eax
       movsx     r9,r9w
       movsx     rdx,dx
       movsx     r8,r8w
       call      qword ptr [7FFCF3775B28]
       jmp       short M01_L06
M01_L05:
       mov       [rsp+20],eax
       mov       edx,[rsp+40]
       mov       r8d,[rsp+3C]
       mov       r9d,[rsp+38]
       call      qword ptr [7FFCF38F5E40]
M01_L06:
       jmp       short M01_L08
       movsx     rdx,word ptr [r8]
       movsx     r9,word ptr [r8+2]
       movsx     r10,word ptr [r8+4]
       movsx     r8,word ptr [r8+6]
       mov       [rsp+20],r8d
       mov       [rsp+28],eax
       mov       r8d,r9d
       mov       r9d,r10d
       call      qword ptr [7FFCF38F7618]
       jmp       short M01_L08
       movsx     rdx,word ptr [r8]
       movsx     r9,word ptr [r8+2]
       movsx     r10,word ptr [r8+4]
       movsx     r11,word ptr [r8+6]
       movsx     r8,word ptr [r8+8]
       mov       [rsp+20],r11d
       mov       [rsp+28],r8d
       mov       [rsp+30],eax
       mov       r8d,r9d
       mov       r9d,r10d
       call      qword ptr [7FFCF38F7DF8]
       jmp       short M01_L08
M01_L07:
       mov       edx,eax
       call      qword ptr [7FFCF38F9708]
M01_L08:
       test      eax,eax
       jge       short M01_L09
       add       rsp,50
       pop       rbx
       pop       rsi
       pop       rdi
       ret
M01_L09:
       add       eax,esi
       add       rsp,50
       pop       rbx
       pop       rsi
       pop       rdi
       ret
M01_L10:
       mov       ecx,60
       call      qword ptr [7FFCF3463378]
       int       3
M01_L11:
       mov       ecx,8
       xor       edx,edx
       call      qword ptr [7FFCF34633C0]
       int       3
M01_L12:
       mov       ecx,1B
       mov       edx,4
       call      qword ptr [7FFCF34633C0]
       int       3
; Total bytes of code 593

Microsoft.Extensions.Primitives.StringSegmentBenchmark.IndexOf


Description of detection logic

IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 5.941599996860388 > 4.2354669408050105.
IsChangePoint: Marked as a change because one of 10/25/2022 2:34:53 PM, 1/3/2023 6:29:42 AM, 1/10/2023 1:28:02 AM falls between 1/1/2023 3:57:25 AM and 1/10/2023 1:28:02 AM.
IsRegressionStdDev: Marked as regression because -82.8391960488371 (T) = (0 -5.880832532147385) / Math.Sqrt((3.0369285908006302E-05 / (14)) + (0.01634542094563601 / (33))) is less than -2.0141033888794695 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (14) + (33) - 2, .025) and -0.45812166502067553 = (4.033156267562897 - 5.880832532147385) / 4.033156267562897 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

```### Baseline Jit Disasm

```assembly
; Microsoft.Extensions.Primitives.StringSegmentBenchmark.IndexOf()
       sub       rsp,28
       add       rcx,38
       mov       eax,0FFFFFFFF
       mov       rdx,[rcx]
       test      rdx,rdx
       je        short M00_L00
       mov       r8d,[rcx+0C]
       test      r8d,r8d
       je        short M00_L01
       lea       eax,[r8-1]
       cmp       eax,7
       jb        short M00_L02
       cmp       r8d,8
       jb        short M00_L03
       mov       ecx,[rcx+8]
       inc       ecx
       mov       r8d,[rdx+8]
       mov       eax,ecx
       add       rax,7
       cmp       r8,rax
       jb        short M00_L04
       mov       ecx,ecx
       lea       rcx,[rdx+rcx*2+0C]
       mov       edx,20
       mov       r8d,7
       call      qword ptr [7FFC523316A8]; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       test      eax,eax
       jl        short M00_L00
       inc       eax
M00_L00:
       add       rsp,28
       ret
M00_L01:
       mov       ecx,4
       call      qword ptr [7FFC52717018]
       int       3
M00_L02:
       mov       ecx,5
       call      qword ptr [7FFC52717018]
       int       3
M00_L03:
       mov       edx,1
       mov       r8d,7
       mov       r9d,4
       call      qword ptr [7FFC52513B28]
       int       3
M00_L04:
       mov       ecx,21
       call      qword ptr [7FFC524E3828]
       int       3
; Total bytes of code 160
; System.SpanHelpers.IndexOfValueType[[System.Int16, System.Private.CoreLib],[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       vzeroupper
       cmp       r8d,8
       jge       near ptr M01_L06
       xor       r9d,r9d
       cmp       r8d,4
       jl        short M01_L00
       add       r8d,0FFFFFFFC
       movsx     rax,word ptr [rcx+r9*2]
       movsx     r10,dx
       cmp       eax,r10d
       je        short M01_L05
       nop       dword ptr [rax]
       movsx     rax,word ptr [rcx+r9*2+2]
       cmp       eax,r10d
       je        short M01_L04
       movsx     rax,word ptr [rcx+r9*2+4]
       cmp       eax,r10d
       je        short M01_L03
       movsx     rax,word ptr [rcx+r9*2+6]
       cmp       eax,r10d
       je        short M01_L02
       add       r9,4
M01_L00:
       test      r8d,r8d
       jle       near ptr M01_L13
       movsx     r10,dx
       xchg      ax,ax
M01_L01:
       dec       r8d
       movsx     rax,word ptr [rcx+r9*2]
       cmp       eax,r10d
       je        short M01_L05
       inc       r9
       test      r8d,r8d
       jg        short M01_L01
       jmp       near ptr M01_L13
M01_L02:
       lea       eax,[r9+3]
       jmp       near ptr M01_L12
M01_L03:
       lea       eax,[r9+2]
       jmp       near ptr M01_L12
M01_L04:
       lea       eax,[r9+1]
       jmp       near ptr M01_L12
M01_L05:
       mov       eax,r9d
       jmp       near ptr M01_L12
M01_L06:
       cmp       r8d,10
       jl        near ptr M01_L09
       movsx     r10,dx
       vmovd     xmm0,r10d
       vpbroadcastw ymm0,xmm0
       mov       rax,rcx
       lea       edx,[r8-10]
       movsxd    r10,edx
       lea       r9,[rax+r10*2]
M01_L07:
       vpcmpeqw  ymm1,ymm0,[rax]
       vptest    ymm1,ymm1
       jne       short M01_L08
       add       rax,20
       cmp       rax,r9
       jbe       short M01_L07
       mov       eax,r8d
       test      al,0F
       je        near ptr M01_L13
       vpcmpeqw  ymm1,ymm0,[r9]
       vptest    ymm1,ymm1
       je        near ptr M01_L13
       sub       r9,rcx
       mov       rax,r9
       shr       rax,3F
       add       rax,r9
       sar       rax,1
       vmovupd   ymm0,[7FFC51DA2820]
       vpshufb   ymm1,ymm1,ymm0
       vpermq    ymm0,ymm1,0D8
       vpmovmskb ecx,xmm0
       xor       r8d,r8d
       tzcnt     r8d,ecx
       add       eax,r8d
       jmp       near ptr M01_L12
       nop       word ptr [rax+rax]
M01_L08:
       sub       rax,rcx
       mov       rcx,rax
       shr       rcx,3F
       add       rax,rcx
       sar       rax,1
       vmovupd   ymm0,[7FFC51DA2820]
       vpshufb   ymm0,ymm1,ymm0
       vpermq    ymm0,ymm0,0D8
       vpmovmskb edx,xmm0
       tzcnt     edx,edx
       add       eax,edx
       jmp       near ptr M01_L12
M01_L09:
       movsx     r10,dx
       vmovd     xmm0,r10d
       vpbroadcastw xmm0,xmm0
       mov       rax,rcx
       lea       edx,[r8-8]
       movsxd    r10,edx
       lea       rdx,[rax+r10*2]
M01_L10:
       vpcmpeqw  xmm1,xmm0,[rax]
       vptest    xmm1,xmm1
       jne       short M01_L11
       add       rax,10
       cmp       rax,rdx
       jbe       short M01_L10
       mov       eax,r8d
       test      al,7
       je        short M01_L13
       vpcmpeqw  xmm1,xmm0,[rdx]
       vptest    xmm1,xmm1
       je        short M01_L13
       sub       rdx,rcx
       mov       rax,rdx
       shr       rax,3F
       add       rax,rdx
       sar       rax,1
       vpshufb   xmm1,xmm1,[7FFC51DA2820]
       vpmovmskb ecx,xmm1
       xor       r8d,r8d
       tzcnt     r8d,ecx
       add       eax,r8d
       jmp       short M01_L12
M01_L11:
       sub       rax,rcx
       mov       rcx,rax
       shr       rcx,3F
       add       rax,rcx
       sar       rax,1
       vpshufb   xmm0,xmm1,[7FFC51DA2820]
       vpmovmskb edx,xmm0
       tzcnt     edx,edx
       add       eax,edx
M01_L12:
       vzeroupper
       ret
M01_L13:
       mov       eax,0FFFFFFFF
       vzeroupper
       ret
; Total bytes of code 512

Compare Jit Disasm

; Microsoft.Extensions.Primitives.StringSegmentBenchmark.IndexOf()
       sub       rsp,28
       add       rcx,38
       mov       eax,0FFFFFFFF
       mov       rdx,[rcx]
       test      rdx,rdx
       je        short M00_L00
       mov       r8d,[rcx+0C]
       test      r8d,r8d
       je        short M00_L01
       lea       eax,[r8-1]
       cmp       eax,7
       jb        short M00_L02
       cmp       r8d,8
       jb        short M00_L03
       mov       ecx,[rcx+8]
       inc       ecx
       mov       r8d,[rdx+8]
       mov       eax,ecx
       add       rax,7
       cmp       r8,rax
       jb        short M00_L04
       mov       ecx,ecx
       lea       rcx,[rdx+rcx*2+0C]
       mov       edx,20
       mov       r8d,7
       call      qword ptr [7FF9AB9458E8]; System.PackedSpanHelpers.IndexOf[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       test      eax,eax
       jl        short M00_L00
       inc       eax
M00_L00:
       add       rsp,28
       ret
M00_L01:
       mov       ecx,4
       call      qword ptr [7FF9ABD17018]
       int       3
M00_L02:
       mov       ecx,5
       call      qword ptr [7FF9ABD17018]
       int       3
M00_L03:
       mov       edx,1
       mov       r8d,7
       mov       r9d,4
       call      qword ptr [7FF9ABB1BF60]
       int       3
M00_L04:
       mov       ecx,21
       call      qword ptr [7FF9AB8C33A8]
       int       3
; Total bytes of code 160
; System.PackedSpanHelpers.IndexOf[[System.SpanHelpers+DontNegate`1[[System.Int16, System.Private.CoreLib]], System.Private.CoreLib]](Int16 ByRef, Int16, Int32)
       vzeroupper
       cmp       r8d,8
       jge       near ptr M01_L07
       xor       r9d,r9d
       cmp       r8d,4
       jl        short M01_L04
       add       r8d,0FFFFFFFC
       movsx     rax,word ptr [rcx]
       movsx     r10,dx
       cmp       eax,r10d
       jne       short M01_L00
       xor       eax,eax
       vzeroupper
       ret
M01_L00:
       movsx     rax,word ptr [rcx+2]
       cmp       eax,r10d
       jne       short M01_L01
       mov       eax,1
       vzeroupper
       ret
M01_L01:
       movsx     rax,word ptr [rcx+4]
       cmp       eax,r10d
       jne       short M01_L02
       mov       eax,2
       vzeroupper
       ret
M01_L02:
       movsx     r9,word ptr [rcx+6]
       cmp       r9d,r10d
       jne       short M01_L03
       mov       eax,3
       jmp       near ptr M01_L19
       nop       word ptr [rax+rax]
M01_L03:
       mov       r9d,4
M01_L04:
       test      r8d,r8d
       jle       near ptr M01_L18
       movsx     r10,dx
M01_L05:
       dec       r8d
       movsx     rax,word ptr [rcx+r9*2]
       cmp       eax,r10d
       je        short M01_L06
       inc       r9
       test      r8d,r8d
       jg        short M01_L05
       jmp       near ptr M01_L18
       nop       dword ptr [rax]
M01_L06:
       mov       eax,r9d
       jmp       near ptr M01_L19
M01_L07:
       mov       rax,rcx
       cmp       r8d,10
       jle       near ptr M01_L14
       movzx     edx,dl
       vmovd     xmm0,edx
       vpbroadcastb ymm0,xmm0
       cmp       r8d,20
       jle       short M01_L09
       lea       r10d,[r8-20]
       movsxd    r9,r10d
       lea       rdx,[rax+r9*2]
M01_L08:
       vmovdqu   ymm1,ymmword ptr [rax]
       vpackuswb ymm1,ymm1,[rax+20]
       vpcmpeqb  ymm1,ymm0,ymm1
       vptest    ymm1,ymm1
       jne       short M01_L10
       add       rax,40
       cmp       rax,rdx
       jb        short M01_L08
M01_L09:
       add       r8d,0FFFFFFF0
       movsxd    rdx,r8d
       lea       rdx,[rcx+rdx*2]
       cmp       rax,rdx
       ja        short M01_L11
       mov       r8,rax
       jmp       short M01_L12
M01_L10:
       vpmovmskb edx,ymm1
       sub       rax,rcx
       mov       r8,rax
       shr       r8,3F
       add       rax,r8
       sar       rax,1
       mov       ecx,edx
       and       ecx,0FF0000FF
       and       edx,0FFFF00
       bswap     edx
       or        edx,ecx
       tzcnt     edx,edx
       add       eax,edx
       jmp       near ptr M01_L19
M01_L11:
       mov       r8,rdx
M01_L12:
       vmovdqu   ymm1,ymmword ptr [r8]
       vpackuswb ymm1,ymm1,[rdx]
       vpcmpeqb  ymm0,ymm0,ymm1
       vptest    ymm0,ymm0
       je        near ptr M01_L18
       vpmovmskb eax,ymm0
       mov       r9d,eax
       and       r9d,0FF0000FF
       and       eax,0FFFF00
       bswap     eax
       or        eax,r9d
       tzcnt     eax,eax
       cmp       eax,10
       jl        short M01_L13
       mov       r8,rdx
       add       eax,0FFFFFFF0
M01_L13:
       sub       r8,rcx
       mov       rcx,r8
       shr       rcx,3F
       add       rcx,r8
       sar       rcx,1
       add       eax,ecx
       jmp       short M01_L19
M01_L14:
       movzx     edx,dl
       vmovd     xmm0,edx
       vpbroadcastb xmm0,xmm0
       add       r8d,0FFFFFFF8
       movsxd    rdx,r8d
       lea       rax,[rax+rdx*2]
       cmp       rcx,rax
       ja        short M01_L15
       mov       rdx,rcx
       jmp       short M01_L16
M01_L15:
       mov       rdx,rax
M01_L16:
       vmovdqu   xmm1,xmmword ptr [rdx]
       vpackuswb xmm1,xmm1,[rax]
       vpcmpeqb  xmm0,xmm0,xmm1
       vptest    xmm0,xmm0
       je        short M01_L18
       vpmovmskb r8d,xmm0
       tzcnt     r8d,r8d
       cmp       r8d,8
       jl        short M01_L17
       mov       rdx,rax
       add       r8d,0FFFFFFF8
M01_L17:
       sub       rdx,rcx
       mov       rax,rdx
       shr       rax,3F
       add       rax,rdx
       sar       rax,1
       add       eax,r8d
       jmp       short M01_L19
M01_L18:
       mov       eax,0FFFFFFFF
M01_L19:
       vzeroupper
       ret
; Total bytes of code 500

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

@dakersnar
Copy link
Contributor

@MihaZupan It looks like about half of the IndexOf regressions you mention are still regressed in some way. Can you take a look and tell me if any are worth fixing? Notably these are all on the scale of nanoseconds.

@dakersnar
Copy link
Contributor

these ones look like they are unrelated to IndexOf changes (don't want them to slip by)
Regressions in System.Runtime.Intrinsics.Tests.Perf_Vector128Int
Regressions in System.Runtime.Intrinsics.Tests.Perf_Vector128Of
Regressions in System.Runtime.Intrinsics.Tests.Perf_Vector128Of
Regressions in System.Runtime.Intrinsics.Tests.Perf_Vector128Of
Regressions in System.Runtime.Intrinsics.Tests.Perf_Vector128Of
Regressions in System.Collections.Tests.Perf_BitArray
Regressions in System.Tests.Perf_HashCode
Regressions in System.Collections.CreateAddAndClear
Regressions in PerfLabTests.CastingPerf
Regressions in PerfLabTests.CastingPerf2.CastingPerf
Regressions in Benchstone.BenchI.IniArray
Regressions in System.Collections.IterateForEach
Regressions in System.Collections.AddGivenSize
Regressions in System.Memory.Span
Regressions in LinqBenchmarks
Regressions in System.Collections.TryGetValueFalse<Int32, Int32>

Appreciate the callout. I checked all of these and they are either noisy, resolved, or not relevant enough to worry about.

@tannergooding
Copy link
Member

Closing as noise

@ghost ghost removed the untriaged New issue has not been triaged by the area owner label Mar 23, 2023
@dotnet dotnet locked as resolved and limited conversation to collaborators Apr 22, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Projects
None yet
Development

No branches or pull requests

4 participants