Closed
Description
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 |
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
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
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 |
Repro
git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Tests.Perf_String*'
Payloads
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 |
Repro
git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Memory.Span<Int32>*'
Payloads
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<Int32>.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