Closed
Description
Run Information
Architecture | x64 |
---|---|
OS | Windows 10.0.18362 |
Baseline | 9e05d3347be231ae1bfcc7037ddecfb5c4ca51a1 |
Compare | 120b7215c9d029fccee94f46864494d79074a0eb |
Diff | Diff |
Improvements in System.Hashing
Benchmark | Baseline | Test | Test/Base | Test Quality | Edge Detector | Baseline IR | Compare IR | IR Ratio | Baseline ETL | Compare ETL |
---|---|---|---|---|---|---|---|---|---|---|
GetStringHashCode - Duration of single invocation | 5.12 μs | 4.26 μs | 0.83 | 0.01 | False | 31745.111037454426 | 34131.52333700845 | 1.075174167661232 | Trace | Trace |
GetStringHashCode - Duration of single invocation | 514.99 ns | 428.98 ns | 0.83 | 0.01 | False | 3175.6621522449796 | 3422.664731656945 | 1.0777798668656713 | Trace | Trace |
GetStringHashCode - Duration of single invocation | 49.90 ns | 41.99 ns | 0.84 | 0.01 | False | 348.72924267701086 | 371.19905279971624 | 1.0644333981005334 | Trace | Trace |
Repro
git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Hashing*'
Payloads
Histogram
System.Hashing.GetStringHashCode(BytesCount: 10000)
Description of detection logic
IsImprovementBase: Marked as improvement because the compare was 5% less than the baseline, and the value was not too small.
IsImprovementCheck: Marked as improvement because the three check build points were 0.05 less than the baseline.
IsRegressionBase: Marked as not a regression because the compare was not 5% greater than the baseline, or the value was too small.
IsImprovementBase: Marked as improvement because the compare was 5% less than the baseline, and the value was not too small.
IsImprovementCheck: Marked as improvement because the three check build points were 0.05 less than the baseline.
IsImprovementWindowed:Marked as improvement because 4.259457129225736 < 4.861916816841414.
IsChangePoint: Marked as a change because one of 1/11/2023 2:37:52 AM, 2/1/2023 8:39:12 AM, 2/7/2023 2:48:42 AM falls between 1/29/2023 12:56:15 AM and 2/7/2023 2:48:42 AM.
IsImprovementStdDev: Marked as improvement because 15.707760337442279 (T) = (0 -4263.181749355853) / Math.Sqrt((161829.14493258545 / (299)) + (49.53276489203591 / (31))) is greater than 1.9672228266464409 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (299) + (31) - 2, .975) and 0.07905796095664383 = (4629.153159067756 - 4263.181749355853) / 4629.153159067756 is greater than 0.05.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.
```### Baseline Jit Disasm
```assembly
; System.Hashing.GetStringHashCode()
mov rcx,[rcx+8]
mov edx,[rcx+8]
add edx,edx
add rcx,0C
mov r8d,498B3E8A
mov r9d,0EE34D32B
jmp qword ptr [7FFE37DD77E0]; System.Marvin.ComputeHash32(Byte ByRef, UInt32, UInt32, UInt32)
; Total bytes of code 31
; System.Marvin.ComputeHash32(Byte ByRef, UInt32, UInt32, UInt32)
cmp edx,8
jb near ptr M01_L04
mov eax,edx
shr eax,3
xchg ax,ax
M01_L00:
add r8d,[rcx]
mov r10d,[rcx+4]
xor r9d,r8d
rol r8d,14
add r8d,r9d
rol r9d,9
xor r9d,r8d
rol r8d,1B
add r8d,r9d
rol r9d,13
add r10d,r8d
mov r8d,r9d
xor r8d,r10d
rol r10d,14
add r10d,r8d
rol r8d,9
xor r8d,r10d
rol r10d,1B
add r10d,r8d
rol r8d,13
mov r9d,r10d
add rcx,8
dec eax
xchg r8,r9
jne short M01_L00
test dl,4
jne short M01_L03
M01_L01:
mov eax,edx
and rax,7
mov eax,[rcx+rax-4]
shr eax,8
or eax,80000000
not edx
shl edx,3
shrx eax,eax,edx
M01_L02:
add eax,r8d
mov ecx,r9d
xor ecx,eax
rol eax,14
add eax,ecx
rol ecx,9
xor ecx,eax
rol eax,1B
add eax,ecx
rol ecx,13
mov edx,ecx
xor edx,eax
rol eax,14
add eax,edx
rol edx,9
xor edx,eax
rol eax,1B
add eax,edx
mov r8d,edx
rol r8d,13
xor eax,r8d
ret
M01_L03:
add r8d,[rcx]
xor r9d,r8d
rol r8d,14
add r8d,r9d
rol r9d,9
xor r9d,r8d
rol r8d,1B
add r8d,r9d
rol r9d,13
jmp short M01_L01
M01_L04:
cmp edx,4
jae short M01_L03
mov eax,80
test dl,1
jne short M01_L06
M01_L05:
test dl,2
je short M01_L02
shl eax,10
movzx ecx,word ptr [rcx]
or eax,ecx
jmp short M01_L02
M01_L06:
mov eax,edx
and rax,2
movzx eax,byte ptr [rcx+rax]
or eax,8000
jmp short M01_L05
; Total bytes of code 268
Compare Jit Disasm
; System.Hashing.GetStringHashCode()
mov rcx,[rcx+8]
mov edx,[rcx+8]
add edx,edx
add rcx,0C
mov r8d,8F11EC8C
mov r9d,0AC2DCF33
jmp qword ptr [7FFD15EF77E0]; System.Marvin.ComputeHash32(Byte ByRef, UInt32, UInt32, UInt32)
; Total bytes of code 31
; System.Marvin.ComputeHash32(Byte ByRef, UInt32, UInt32, UInt32)
cmp edx,8
jb near ptr M01_L04
mov eax,edx
shr eax,3
xchg ax,ax
M01_L00:
add r8d,[rcx]
mov r10d,[rcx+4]
xor r9d,r8d
rol r8d,14
add r8d,r9d
rol r9d,9
xor r9d,r8d
rol r8d,1B
add r8d,r9d
rol r9d,13
add r10d,r8d
mov r8d,r9d
xor r8d,r10d
rol r10d,14
add r10d,r8d
rol r8d,9
xor r8d,r10d
rol r10d,1B
add r10d,r8d
rol r8d,13
mov r9d,r10d
add rcx,8
dec eax
mov r10d,r8d
mov r8d,r9d
mov r9d,r10d
jne short M01_L00
test dl,4
jne short M01_L03
M01_L01:
mov eax,edx
and rax,7
mov eax,[rcx+rax-4]
shr eax,8
or eax,80000000
not edx
shl edx,3
shrx eax,eax,edx
M01_L02:
add eax,r8d
mov ecx,r9d
xor ecx,eax
rol eax,14
add eax,ecx
rol ecx,9
xor ecx,eax
rol eax,1B
add eax,ecx
rol ecx,13
mov edx,ecx
xor edx,eax
rol eax,14
add eax,edx
rol edx,9
xor edx,eax
rol eax,1B
add eax,edx
mov r8d,edx
rol r8d,13
xor eax,r8d
ret
M01_L03:
add r8d,[rcx]
xor r9d,r8d
rol r8d,14
add r8d,r9d
rol r9d,9
xor r9d,r8d
rol r8d,1B
add r8d,r9d
rol r9d,13
jmp short M01_L01
M01_L04:
cmp edx,4
jae short M01_L03
mov eax,80
test dl,1
jne short M01_L06
M01_L05:
test dl,2
je short M01_L02
shl eax,10
movzx ecx,word ptr [rcx]
or eax,ecx
jmp short M01_L02
M01_L06:
mov eax,edx
and rax,2
movzx eax,byte ptr [rcx+rax]
or eax,8000
jmp short M01_L05
; Total bytes of code 274
System.Hashing.GetStringHashCode(BytesCount: 1000)
Description of detection logic
IsImprovementBase: Marked as improvement because the compare was 5% less than the baseline, and the value was not too small.
IsImprovementCheck: Marked as improvement because the three check build points were 0.05 less than the baseline.
IsRegressionBase: Marked as not a regression because the compare was not 5% greater than the baseline, or the value was too small.
IsImprovementBase: Marked as improvement because the compare was 5% less than the baseline, and the value was not too small.
IsImprovementCheck: Marked as improvement because the three check build points were 0.05 less than the baseline.
IsImprovementWindowed:Marked as improvement because 428.9754413334806 < 488.01522508966644.
IsChangePoint: Marked as a change because one of 1/11/2023 2:37:52 AM, 2/1/2023 8:39:12 AM, 2/7/2023 2:48:42 AM falls between 1/29/2023 12:56:15 AM and 2/7/2023 2:48:42 AM.
IsImprovementStdDev: Marked as improvement because 14.934018603798679 (T) = (0 -429.3133211633172) / Math.Sqrt((1635.753798625906 / (299)) + (0.5051821819107114 / (31))) is greater than 1.9672228266464409 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (299) + (31) - 2, .975) and 0.07534449588915947 = (464.29542597721286 - 429.3133211633172) / 464.29542597721286 is greater than 0.05.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.
```### Baseline Jit Disasm
```assembly
; System.Hashing.GetStringHashCode()
mov rcx,[rcx+8]
mov edx,[rcx+8]
add edx,edx
add rcx,0C
mov r8d,2097B732
mov r9d,0FC5889B6
jmp qword ptr [7FFE37DE77E0]; System.Marvin.ComputeHash32(Byte ByRef, UInt32, UInt32, UInt32)
; Total bytes of code 31
; System.Marvin.ComputeHash32(Byte ByRef, UInt32, UInt32, UInt32)
cmp edx,8
jb near ptr M01_L04
mov eax,edx
shr eax,3
xchg ax,ax
M01_L00:
add r8d,[rcx]
mov r10d,[rcx+4]
xor r9d,r8d
rol r8d,14
add r8d,r9d
rol r9d,9
xor r9d,r8d
rol r8d,1B
add r8d,r9d
rol r9d,13
add r10d,r8d
mov r8d,r9d
xor r8d,r10d
rol r10d,14
add r10d,r8d
rol r8d,9
xor r8d,r10d
rol r10d,1B
add r10d,r8d
rol r8d,13
mov r9d,r10d
add rcx,8
dec eax
xchg r8,r9
jne short M01_L00
test dl,4
jne short M01_L03
M01_L01:
mov eax,edx
and rax,7
mov eax,[rcx+rax-4]
shr eax,8
or eax,80000000
not edx
shl edx,3
shrx eax,eax,edx
M01_L02:
add eax,r8d
mov ecx,r9d
xor ecx,eax
rol eax,14
add eax,ecx
rol ecx,9
xor ecx,eax
rol eax,1B
add eax,ecx
rol ecx,13
mov edx,ecx
xor edx,eax
rol eax,14
add eax,edx
rol edx,9
xor edx,eax
rol eax,1B
add eax,edx
mov r8d,edx
rol r8d,13
xor eax,r8d
ret
M01_L03:
add r8d,[rcx]
xor r9d,r8d
rol r8d,14
add r8d,r9d
rol r9d,9
xor r9d,r8d
rol r8d,1B
add r8d,r9d
rol r9d,13
jmp short M01_L01
M01_L04:
cmp edx,4
jae short M01_L03
mov eax,80
test dl,1
jne short M01_L06
M01_L05:
test dl,2
je short M01_L02
shl eax,10
movzx ecx,word ptr [rcx]
or eax,ecx
jmp short M01_L02
M01_L06:
mov eax,edx
and rax,2
movzx eax,byte ptr [rcx+rax]
or eax,8000
jmp short M01_L05
; Total bytes of code 268
Compare Jit Disasm
; System.Hashing.GetStringHashCode()
mov rcx,[rcx+8]
mov edx,[rcx+8]
add edx,edx
add rcx,0C
mov r8d,21E0CB1B
mov r9d,4ED24D25
jmp qword ptr [7FFD15EF77E0]; System.Marvin.ComputeHash32(Byte ByRef, UInt32, UInt32, UInt32)
; Total bytes of code 31
; System.Marvin.ComputeHash32(Byte ByRef, UInt32, UInt32, UInt32)
cmp edx,8
jb near ptr M01_L04
mov eax,edx
shr eax,3
xchg ax,ax
M01_L00:
add r8d,[rcx]
mov r10d,[rcx+4]
xor r9d,r8d
rol r8d,14
add r8d,r9d
rol r9d,9
xor r9d,r8d
rol r8d,1B
add r8d,r9d
rol r9d,13
add r10d,r8d
mov r8d,r9d
xor r8d,r10d
rol r10d,14
add r10d,r8d
rol r8d,9
xor r8d,r10d
rol r10d,1B
add r10d,r8d
rol r8d,13
mov r9d,r10d
add rcx,8
dec eax
mov r10d,r8d
mov r8d,r9d
mov r9d,r10d
jne short M01_L00
test dl,4
jne short M01_L03
M01_L01:
mov eax,edx
and rax,7
mov eax,[rcx+rax-4]
shr eax,8
or eax,80000000
not edx
shl edx,3
shrx eax,eax,edx
M01_L02:
add eax,r8d
mov ecx,r9d
xor ecx,eax
rol eax,14
add eax,ecx
rol ecx,9
xor ecx,eax
rol eax,1B
add eax,ecx
rol ecx,13
mov edx,ecx
xor edx,eax
rol eax,14
add eax,edx
rol edx,9
xor edx,eax
rol eax,1B
add eax,edx
mov r8d,edx
rol r8d,13
xor eax,r8d
ret
M01_L03:
add r8d,[rcx]
xor r9d,r8d
rol r8d,14
add r8d,r9d
rol r9d,9
xor r9d,r8d
rol r8d,1B
add r8d,r9d
rol r9d,13
jmp short M01_L01
M01_L04:
cmp edx,4
jae short M01_L03
mov eax,80
test dl,1
jne short M01_L06
M01_L05:
test dl,2
je short M01_L02
shl eax,10
movzx ecx,word ptr [rcx]
or eax,ecx
jmp short M01_L02
M01_L06:
mov eax,edx
and rax,2
movzx eax,byte ptr [rcx+rax]
or eax,8000
jmp short M01_L05
; Total bytes of code 274
System.Hashing.GetStringHashCode(BytesCount: 100)
Description of detection logic
IsImprovementBase: Marked as improvement because the compare was 5% less than the baseline, and the value was not too small.
IsImprovementCheck: Marked as improvement because the three check build points were 0.05 less than the baseline.
IsRegressionBase: Marked as not a regression because the compare was not 5% greater than the baseline, or the value was too small.
IsImprovementBase: Marked as improvement because the compare was 5% less than the baseline, and the value was not too small.
IsImprovementCheck: Marked as improvement because the three check build points were 0.05 less than the baseline.
IsImprovementWindowed:Marked as improvement because 41.9909952795244 < 47.30019401229703.
IsChangePoint: Marked as a change because one of 1/11/2023 2:37:52 AM, 2/1/2023 8:39:12 AM, 2/7/2023 2:48:42 AM falls between 1/29/2023 12:56:15 AM and 2/7/2023 2:48:42 AM.
IsImprovementStdDev: Marked as improvement because 14.04233906413725 (T) = (0 -42.02601635038894) / Math.Sqrt((14.24359323533544 / (299)) + (0.004230834964311884 / (31))) is greater than 1.9672228266464409 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (299) + (31) - 2, .975) and 0.06806184755264275 = (45.09528474612255 - 42.02601635038894) / 45.09528474612255 is greater than 0.05.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.
```### Baseline Jit Disasm
```assembly
; System.Hashing.GetStringHashCode()
mov rcx,[rcx+8]
mov edx,[rcx+8]
add edx,edx
add rcx,0C
mov r8d,8863D732
mov r9d,0A10E1BC4
jmp qword ptr [7FFE37DE77E0]; System.Marvin.ComputeHash32(Byte ByRef, UInt32, UInt32, UInt32)
; Total bytes of code 31
; System.Marvin.ComputeHash32(Byte ByRef, UInt32, UInt32, UInt32)
cmp edx,8
jb near ptr M01_L04
mov eax,edx
shr eax,3
xchg ax,ax
M01_L00:
add r8d,[rcx]
mov r10d,[rcx+4]
xor r9d,r8d
rol r8d,14
add r8d,r9d
rol r9d,9
xor r9d,r8d
rol r8d,1B
add r8d,r9d
rol r9d,13
add r10d,r8d
mov r8d,r9d
xor r8d,r10d
rol r10d,14
add r10d,r8d
rol r8d,9
xor r8d,r10d
rol r10d,1B
add r10d,r8d
rol r8d,13
mov r9d,r10d
add rcx,8
dec eax
xchg r8,r9
jne short M01_L00
test dl,4
jne short M01_L03
M01_L01:
mov eax,edx
and rax,7
mov eax,[rcx+rax-4]
shr eax,8
or eax,80000000
not edx
shl edx,3
shrx eax,eax,edx
M01_L02:
add eax,r8d
mov ecx,r9d
xor ecx,eax
rol eax,14
add eax,ecx
rol ecx,9
xor ecx,eax
rol eax,1B
add eax,ecx
rol ecx,13
mov edx,ecx
xor edx,eax
rol eax,14
add eax,edx
rol edx,9
xor edx,eax
rol eax,1B
add eax,edx
mov r8d,edx
rol r8d,13
xor eax,r8d
ret
M01_L03:
add r8d,[rcx]
xor r9d,r8d
rol r8d,14
add r8d,r9d
rol r9d,9
xor r9d,r8d
rol r8d,1B
add r8d,r9d
rol r9d,13
jmp short M01_L01
M01_L04:
cmp edx,4
jae short M01_L03
mov eax,80
test dl,1
jne short M01_L06
M01_L05:
test dl,2
je short M01_L02
shl eax,10
movzx ecx,word ptr [rcx]
or eax,ecx
jmp short M01_L02
M01_L06:
mov eax,edx
and rax,2
movzx eax,byte ptr [rcx+rax]
or eax,8000
jmp short M01_L05
; Total bytes of code 268
Compare Jit Disasm
; System.Hashing.GetStringHashCode()
mov rcx,[rcx+8]
mov edx,[rcx+8]
add edx,edx
add rcx,0C
mov r8d,0C1355F7B
mov r9d,9B82D83A
jmp qword ptr [7FFD15EF77E0]; System.Marvin.ComputeHash32(Byte ByRef, UInt32, UInt32, UInt32)
; Total bytes of code 31
; System.Marvin.ComputeHash32(Byte ByRef, UInt32, UInt32, UInt32)
cmp edx,8
jb near ptr M01_L04
mov eax,edx
shr eax,3
xchg ax,ax
M01_L00:
add r8d,[rcx]
mov r10d,[rcx+4]
xor r9d,r8d
rol r8d,14
add r8d,r9d
rol r9d,9
xor r9d,r8d
rol r8d,1B
add r8d,r9d
rol r9d,13
add r10d,r8d
mov r8d,r9d
xor r8d,r10d
rol r10d,14
add r10d,r8d
rol r8d,9
xor r8d,r10d
rol r10d,1B
add r10d,r8d
rol r8d,13
mov r9d,r10d
add rcx,8
dec eax
mov r10d,r8d
mov r8d,r9d
mov r9d,r10d
jne short M01_L00
test dl,4
jne short M01_L03
M01_L01:
mov eax,edx
and rax,7
mov eax,[rcx+rax-4]
shr eax,8
or eax,80000000
not edx
shl edx,3
shrx eax,eax,edx
M01_L02:
add eax,r8d
mov ecx,r9d
xor ecx,eax
rol eax,14
add eax,ecx
rol ecx,9
xor ecx,eax
rol eax,1B
add eax,ecx
rol ecx,13
mov edx,ecx
xor edx,eax
rol eax,14
add eax,edx
rol edx,9
xor edx,eax
rol eax,1B
add eax,edx
mov r8d,edx
rol r8d,13
xor eax,r8d
ret
M01_L03:
add r8d,[rcx]
xor r9d,r8d
rol r8d,14
add r8d,r9d
rol r9d,9
xor r9d,r8d
rol r8d,1B
add r8d,r9d
rol r9d,13
jmp short M01_L01
M01_L04:
cmp edx,4
jae short M01_L03
mov eax,80
test dl,1
jne short M01_L06
M01_L05:
test dl,2
je short M01_L02
shl eax,10
movzx ecx,word ptr [rcx]
or eax,ecx
jmp short M01_L02
M01_L06:
mov eax,edx
and rax,2
movzx eax,byte ptr [rcx+rax]
or eax,8000
jmp short M01_L05
; Total bytes of code 274
Docs
Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository
Architecture | x64 |
---|---|
OS | Windows 10.0.18362 |
Baseline | 9e05d3347be231ae1bfcc7037ddecfb5c4ca51a1 |
Compare | 120b7215c9d029fccee94f46864494d79074a0eb |
Diff | Diff |
Improvements in System.Globalization.Tests.StringHash
Benchmark | Baseline | Test | Test/Base | Test Quality | Edge Detector | Baseline IR | Compare IR | IR Ratio | Baseline ETL | Compare ETL |
---|---|---|---|---|---|---|---|---|---|---|
GetHashCode - Duration of single invocation | 135.98 ns | 114.95 ns | 0.85 | 0.01 | False | 895.0379371844866 | 954.3366896308072 | 1.0662527810082063 | Trace | Trace |
GetHashCode - Duration of single invocation | 134.44 μs | 111.63 μs | 0.83 | 0.01 | False | 831594.2028985507 | 895108.695652174 | 1.0763767863367029 | Trace | Trace |
Repro
git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Globalization.Tests.StringHash*'
Payloads
Histogram
System.Globalization.Tests.StringHash.GetHashCode(Count: 128, Options: (en-US, Ordinal))
Description of detection logic
IsImprovementBase: Marked as improvement because the compare was 5% less than the baseline, and the value was not too small.
IsImprovementCheck: Marked as improvement because the three check build points were 0.05 less than the baseline.
IsRegressionBase: Marked as not a regression because the compare was not 5% greater than the baseline, or the value was too small.
IsImprovementBase: Marked as improvement because the compare was 5% less than the baseline, and the value was not too small.
IsImprovementCheck: Marked as improvement because the three check build points were 0.05 less than the baseline.
IsImprovementWindowed:Marked as improvement because 114.95352696317407 < 129.23477808924525.
IsChangePoint: Marked as a change because one of 1/11/2023 2:37:52 AM, 2/1/2023 8:39:12 AM, 2/7/2023 2:48:42 AM falls between 1/29/2023 12:56:15 AM and 2/7/2023 2:48:42 AM.
IsImprovementStdDev: Marked as improvement because 14.136652569217915 (T) = (0 -115.14029851298271) / Math.Sqrt((105.9867351408481 / (299)) + (0.2704206597105524 / (31))) is greater than 1.9672228266464409 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (299) + (31) - 2, .975) and 0.06889492328261387 = (123.65983323698566 - 115.14029851298271) / 123.65983323698566 is greater than 0.05.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.
```### Baseline Jit Disasm
```assembly
; System.Globalization.Tests.StringHash.GetHashCode()
push rsi
sub rsp,30
xor eax,eax
mov [rsp+20],rax
mov rsi,rcx
mov rcx,[rsi+18]
mov rax,[rcx]
mov rax,[rax+48]
call qword ptr [rax+30]
mov rcx,rax
mov rdx,[rsi+8]
mov r8d,[rsi+20]
cmp [rcx],cl
test rdx,rdx
je short M00_L00
lea rax,[rdx+0C]
mov edx,[rdx+8]
mov [rsp+20],rax
mov [rsp+28],edx
lea rdx,[rsp+20]
call qword ptr [7FF9B910B768]; System.Globalization.CompareInfo.GetHashCode(System.ReadOnlySpan`1<Char>, System.Globalization.CompareOptions)
nop
add rsp,30
pop rsi
ret
M00_L00:
mov ecx,27
call qword ptr [7FF9B926D7F8]
int 3
; Total bytes of code 93
; System.Globalization.CompareInfo.GetHashCode(System.ReadOnlySpan`1<Char>, System.Globalization.CompareOptions)
sub rsp,38
xor eax,eax
mov [rsp+28],rax
mov rax,[rdx]
mov edx,[rdx+8]
test r8d,0DFFFFFE0
jne short M01_L01
mov [rsp+28],rax
mov [rsp+30],edx
lea rdx,[rsp+28]
call qword ptr [7FF9B910B948]
M01_L00:
nop
add rsp,38
ret
M01_L01:
cmp r8d,40000000
jne short M01_L02
add edx,edx
mov rcx,rax
mov r8d,0FCDFA37B
mov r9d,99F6C5BE
call qword ptr [7FF9B94357E0]; System.Marvin.ComputeHash32(Byte ByRef, UInt32, UInt32, UInt32)
jmp short M01_L00
M01_L02:
cmp r8d,10000000
jne short M01_L03
mov rcx,rax
mov r8d,0FCDFA37B
mov r9d,99F6C5BE
call qword ptr [7FF9B9435840]
jmp short M01_L00
M01_L03:
mov ecx,r8d
call qword ptr [7FF9B910B258]
int 3
; Total bytes of code 128
Compare Jit Disasm
; System.Globalization.Tests.StringHash.GetHashCode()
push rsi
sub rsp,30
xor eax,eax
mov [rsp+20],rax
mov rsi,rcx
mov rcx,[rsi+18]
mov rax,[rcx]
mov rax,[rax+48]
call qword ptr [rax+30]
mov rcx,rax
mov rdx,[rsi+8]
mov r8d,[rsi+20]
cmp [rcx],cl
test rdx,rdx
je short M00_L00
lea rax,[rdx+0C]
mov edx,[rdx+8]
mov [rsp+20],rax
mov [rsp+28],edx
lea rdx,[rsp+20]
call qword ptr [7FFAA49CB768]; System.Globalization.CompareInfo.GetHashCode(System.ReadOnlySpan`1<Char>, System.Globalization.CompareOptions)
nop
add rsp,30
pop rsi
ret
M00_L00:
mov ecx,27
call qword ptr [7FFAA4B2D7F8]
int 3
; Total bytes of code 93
; System.Globalization.CompareInfo.GetHashCode(System.ReadOnlySpan`1<Char>, System.Globalization.CompareOptions)
sub rsp,28
test r8d,0DFFFFFE0
jne short M01_L01
call qword ptr [7FFAA49CB948]
M01_L00:
nop
add rsp,28
ret
M01_L01:
cmp r8d,40000000
jne short M01_L02
mov rcx,[rdx]
mov edx,[rdx+8]
add edx,edx
mov r8d,0DC6F8DD1
mov r9d,0E81AA38
call qword ptr [7FFAA4CF57E0]; System.Marvin.ComputeHash32(Byte ByRef, UInt32, UInt32, UInt32)
jmp short M01_L00
M01_L02:
cmp r8d,10000000
jne short M01_L03
mov rcx,[rdx]
mov edx,[rdx+8]
mov r8d,0DC6F8DD1
mov r9d,0E81AA38
call qword ptr [7FFAA4CF5840]
jmp short M01_L00
M01_L03:
mov ecx,r8d
call qword ptr [7FFAA49CB258]
int 3
; Total bytes of code 107
System.Globalization.Tests.StringHash.GetHashCode(Count: 131072, Options: (en-US, Ordinal))
Description of detection logic
IsImprovementBase: Marked as improvement because the compare was 5% less than the baseline, and the value was not too small.
IsImprovementCheck: Marked as improvement because the three check build points were 0.05 less than the baseline.
IsRegressionBase: Marked as not a regression because the compare was not 5% greater than the baseline, or the value was too small.
IsImprovementBase: Marked as improvement because the compare was 5% less than the baseline, and the value was not too small.
IsImprovementCheck: Marked as improvement because the three check build points were 0.05 less than the baseline.
IsImprovementWindowed:Marked as improvement because 111.63297023809523 < 127.55409260381504.
IsChangePoint: Marked as a change because one of 1/11/2023 2:37:52 AM, 2/1/2023 8:39:12 AM, 2/7/2023 2:48:42 AM falls between 1/29/2023 12:56:15 AM and 2/7/2023 2:48:42 AM.
IsImprovementStdDev: Marked as improvement because 15.88142444490362 (T) = (0 -111658.33275797736) / Math.Sqrt((110753488.26528594 / (299)) + (29134.202809146725 / (31))) is greater than 1.9672228266464409 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (299) + (31) - 2, .975) and 0.07976129069816927 = (121336.27028435982 - 111658.33275797736) / 121336.27028435982 is greater than 0.05.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.
```### Baseline Jit Disasm
```assembly
; System.Globalization.Tests.StringHash.GetHashCode()
push rsi
sub rsp,30
xor eax,eax
mov [rsp+20],rax
mov rsi,rcx
mov rcx,[rsi+18]
mov rax,[rcx]
mov rax,[rax+48]
call qword ptr [rax+30]
mov rcx,rax
mov rdx,[rsi+8]
mov r8d,[rsi+20]
cmp [rcx],cl
test rdx,rdx
je short M00_L00
lea rax,[rdx+0C]
mov edx,[rdx+8]
mov [rsp+20],rax
mov [rsp+28],edx
lea rdx,[rsp+20]
call qword ptr [7FF9B90EB768]; System.Globalization.CompareInfo.GetHashCode(System.ReadOnlySpan`1<Char>, System.Globalization.CompareOptions)
nop
add rsp,30
pop rsi
ret
M00_L00:
mov ecx,27
call qword ptr [7FF9B924D7F8]
int 3
; Total bytes of code 93
; System.Globalization.CompareInfo.GetHashCode(System.ReadOnlySpan`1<Char>, System.Globalization.CompareOptions)
sub rsp,38
xor eax,eax
mov [rsp+28],rax
mov rax,[rdx]
mov edx,[rdx+8]
test r8d,0DFFFFFE0
jne short M01_L01
mov [rsp+28],rax
mov [rsp+30],edx
lea rdx,[rsp+28]
call qword ptr [7FF9B90EB948]
M01_L00:
nop
add rsp,38
ret
M01_L01:
cmp r8d,40000000
jne short M01_L02
add edx,edx
mov rcx,rax
mov r8d,2E8400DF
mov r9d,5DD936CF
call qword ptr [7FF9B94157E0]; System.Marvin.ComputeHash32(Byte ByRef, UInt32, UInt32, UInt32)
jmp short M01_L00
M01_L02:
cmp r8d,10000000
jne short M01_L03
mov rcx,rax
mov r8d,2E8400DF
mov r9d,5DD936CF
call qword ptr [7FF9B9415840]
jmp short M01_L00
M01_L03:
mov ecx,r8d
call qword ptr [7FF9B90EB258]
int 3
; Total bytes of code 128
Compare Jit Disasm
; System.Globalization.Tests.StringHash.GetHashCode()
push rsi
sub rsp,30
xor eax,eax
mov [rsp+20],rax
mov rsi,rcx
mov rcx,[rsi+18]
mov rax,[rcx]
mov rax,[rax+48]
call qword ptr [rax+30]
mov rcx,rax
mov rdx,[rsi+8]
mov r8d,[rsi+20]
cmp [rcx],cl
test rdx,rdx
je short M00_L00
lea rax,[rdx+0C]
mov edx,[rdx+8]
mov [rsp+20],rax
mov [rsp+28],edx
lea rdx,[rsp+20]
call qword ptr [7FFAA49AB768]; System.Globalization.CompareInfo.GetHashCode(System.ReadOnlySpan`1<Char>, System.Globalization.CompareOptions)
nop
add rsp,30
pop rsi
ret
M00_L00:
mov ecx,27
call qword ptr [7FFAA4B0D7F8]
int 3
; Total bytes of code 93
; System.Globalization.CompareInfo.GetHashCode(System.ReadOnlySpan`1<Char>, System.Globalization.CompareOptions)
sub rsp,28
test r8d,0DFFFFFE0
jne short M01_L01
call qword ptr [7FFAA49AB948]
M01_L00:
nop
add rsp,28
ret
M01_L01:
cmp r8d,40000000
jne short M01_L02
mov rcx,[rdx]
mov edx,[rdx+8]
add edx,edx
mov r8d,3B8B5EA0
mov r9d,78C2656A
call qword ptr [7FFAA4CD57E0]; System.Marvin.ComputeHash32(Byte ByRef, UInt32, UInt32, UInt32)
jmp short M01_L00
M01_L02:
cmp r8d,10000000
jne short M01_L03
mov rcx,[rdx]
mov edx,[rdx+8]
mov r8d,3B8B5EA0
mov r9d,78C2656A
call qword ptr [7FFAA4CD5840]
jmp short M01_L00
M01_L03:
mov ecx,r8d
call qword ptr [7FFAA49AB258]
int 3
; Total bytes of code 107
Docs
Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository
Run Information
Architecture | x64 |
---|---|
OS | Windows 10.0.18362 |
Baseline | 9e05d3347be231ae1bfcc7037ddecfb5c4ca51a1 |
Compare | 120b7215c9d029fccee94f46864494d79074a0eb |
Diff | Diff |
Improvements in System.Collections.TryGetValueFalse<String, String>
Benchmark | Baseline | Test | Test/Base | Test Quality | Edge Detector | Baseline IR | Compare IR | IR Ratio | Baseline ETL | Compare ETL |
---|---|---|---|---|---|---|---|---|---|---|
ImmutableDictionary - Duration of single invocation | 43.31 μs | 35.69 μs | 0.82 | 0.02 | False |
Repro
git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Collections.TryGetValueFalse<String, String>*'
Payloads
Histogram
System.Collections.TryGetValueFalse<String, String>.ImmutableDictionary(Size: 512)
Description of detection logic
IsImprovementBase: Marked as improvement because the compare was 5% less than the baseline, and the value was not too small.
IsImprovementCheck: Marked as improvement because the three check build points were 0.05 less than the baseline.
IsRegressionBase: Marked as not a regression because the compare was not 5% greater than the baseline, or the value was too small.
IsImprovementBase: Marked as improvement because the compare was 5% less than the baseline, and the value was not too small.
IsImprovementCheck: Marked as improvement because the three check build points were 0.05 less than the baseline.
IsImprovementWindowed:Marked as improvement because 35.69157481060606 < 40.65009954213479.
IsChangePoint: Marked as a change because one of 1/11/2023 2:37:52 AM, 2/1/2023 8:39:12 AM, 2/7/2023 2:48:42 AM falls between 1/29/2023 12:56:15 AM and 2/7/2023 2:48:42 AM.
IsImprovementStdDev: Marked as improvement because 15.214504008752215 (T) = (0 -36234.78134613036) / Math.Sqrt((8489236.582768975 / (299)) + (206650.1158824713 / (31))) is greater than 1.9672228266464409 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (299) + (31) - 2, .975) and 0.07288851434001152 = (39083.52113698137 - 36234.78134613036) / 39083.52113698137 is greater than 0.05.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.
Docs
Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository