dotnet / perf-autofiling-issues

A landing place for auto-filed performance issues before they receive triage
MIT License
9 stars 4 forks source link

[Perf] Windows/x86: 11 Improvements on 1/21/2023 6:49:37 AM #12037

Open performanceautofiler[bot] opened 1 year ago

performanceautofiler[bot] commented 1 year ago

Run Information

Architecture x86
OS Windows 10.0.18362
Baseline ff12237f483eb0afdabf1aeb71b69ff992d6bd40
Compare 7ec3634ee579d89b6024f72b595bfd7118093fc5
Diff Diff

Improvements in System.Tests.Perf_UInt32

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
[TryFormat - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Tests.Perf_UInt32.TryFormat(value%3a%200).html>) 3.70 ns 2.14 ns 0.58 0.19 False 51.6380379354531 40.76779491719882 0.789491555975811 Trace Trace
[TryFormat - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Tests.Perf_UInt32.TryFormat(value%3a%2012345).html>) 5.93 ns 4.64 ns 0.78 0.02 False 84.13285153846181 73.09705836329651 0.868828965459227 Trace Trace
[TryFormat - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Tests.Perf_UInt32.TryFormat(value%3a%204294967295).html>) 8.40 ns 7.11 ns 0.85 0.02 False 113.16309777404177 101.82209354307746 0.8997817799791108 Trace Trace

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_UInt32*'
### Payloads [Baseline]() [Compare]() ### Histogram #### System.Tests.Perf_UInt32.TryFormat(value: 0) ```log ``` ### Description of detection logic ```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. 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 2.1356104133875364 < 3.519022420162478. IsChangePoint: Marked as a change because one of 1/21/2023 1:51:00 AM, 1/24/2023 6:33:57 AM falls between 1/15/2023 4:08:29 PM and 1/24/2023 6:33:57 AM. IsImprovementStdDev: Marked as improvement because 65.91892275559097 (T) = (0 -2.1116991512930285) / Math.Sqrt((0.1872562436487989 / (299)) + (0.0004248986178606287 / (17))) is greater than 1.9675476980854363 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (299) + (17) - 2, .975) and 0.44340329911535503 = (3.7939483793862436 - 2.1116991512930285) / 3.7939483793862436 is greater than 0.05. IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so. ```### Baseline Jit Disasm ```assembly ; System.Tests.Perf_UInt32.TryFormat(UInt32) push ebp mov ebp,esp push edi push esi push eax xor eax,eax mov [ebp-0C],eax mov ecx,[ecx+4] test ecx,ecx je short M00_L01 lea esi,[ecx+8] mov edi,[ecx+4] M00_L00: mov ecx,edx push edi push esi lea edx,[ebp-0C] call dword ptr ds:[8CEB888]; System.Number.TryUInt32ToDecStr(UInt32, System.Span`1, Int32 ByRef) pop ecx pop esi pop edi pop ebp ret M00_L01: xor esi,esi xor edi,edi jmp short M00_L00 ; Total bytes of code 48 ``` ```assembly ; System.Number.TryUInt32ToDecStr(UInt32, System.Span`1, Int32 ByRef) push ebp mov ebp,esp push esi push eax xor eax,eax mov [ebp-8],eax mov eax,ecx or eax,1 lzcnt eax,eax xor eax,1F lea eax,[eax*8+6C527C34] mov esi,[eax] mov eax,[eax+4] add esi,ecx adc eax,0 cmp eax,[ebp+0C] jg short M01_L07 mov [edx],eax mov edx,[ebp+8] mov [ebp-8],edx lea esi,[edx+eax*2] cmp ecx,0A jb short M01_L05 cmp ecx,64 jb short M01_L04 M01_L00: add esi,0FFFFFFFC mov edx,51EB851F mov eax,ecx mul edx shr edx,5 imul eax,edx,64 sub ecx,eax mov eax,86A12C0 mov eax,[eax+ecx*4+8] mov [esi],eax cmp edx,64 jae short M01_L03 M01_L01: cmp edx,0A jb short M01_L02 add esi,0FFFFFFFC mov eax,86A12C0 mov edx,[eax+edx*4+8] mov [esi],edx jmp short M01_L06 M01_L02: mov ecx,edx jmp short M01_L05 M01_L03: mov ecx,edx jmp short M01_L00 M01_L04: mov edx,ecx jmp short M01_L01 M01_L05: lea eax,[ecx+30] mov [esi-2],ax M01_L06: xor eax,eax mov [ebp-8],eax mov eax,1 pop ecx pop esi pop ebp ret 8 M01_L07: xor eax,eax mov [edx],eax pop ecx pop esi pop ebp ret 8 ; Total bytes of code 167 ``` ### Compare Jit Disasm ```assembly ; System.Tests.Perf_UInt32.TryFormat(UInt32) push ebp mov ebp,esp push edi push esi sub esp,8 xor eax,eax mov [ebp-0C],eax mov [ebp-10],eax mov eax,[ecx+4] test eax,eax je near ptr M00_L10 lea ecx,[eax+8] mov esi,[eax+4] M00_L00: mov edi,edx mov eax,edi or eax,1 lzcnt eax,eax xor eax,1F lea eax,[eax*8+6BCB6D50] mov edx,[eax] mov eax,[eax+4] add edx,edi adc eax,0 cmp eax,esi jg short M00_L08 mov [ebp-0C],eax mov [ebp-10],ecx lea ecx,[ecx+eax*2] cmp edi,0A jb short M00_L06 cmp edi,64 jb short M00_L05 M00_L01: add ecx,0FFFFFFFC mov edx,51EB851F mov eax,edi mul edx shr edx,5 imul eax,edx,64 sub edi,eax mov eax,86B1224 mov eax,[eax+edi*4+8] mov [ecx],eax cmp edx,64 jae short M00_L04 M00_L02: cmp edx,0A jb short M00_L03 add ecx,0FFFFFFFC mov eax,86B1224 mov edx,[eax+edx*4+8] mov [ecx],edx jmp short M00_L07 M00_L03: mov edi,edx jmp short M00_L06 M00_L04: mov edi,edx jmp short M00_L01 M00_L05: mov edx,edi jmp short M00_L02 M00_L06: lea eax,[edi+30] mov [ecx-2],ax M00_L07: xor eax,eax mov [ebp-10],eax mov eax,1 jmp short M00_L09 M00_L08: xor eax,eax mov [ebp-0C],eax M00_L09: xor edx,edx mov [ebp-10],edx lea esp,[ebp-8] pop esi pop edi pop ebp ret M00_L10: xor ecx,ecx xor esi,esi jmp near ptr M00_L00 ; Total bytes of code 201 ``` #### System.Tests.Perf_UInt32.TryFormat(value: 12345) ```log ``` ### Description of detection logic ```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. 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.639413268714381 < 5.631713898358041. IsChangePoint: Marked as a change because one of 1/21/2023 1:51:00 AM, 1/24/2023 6:33:57 AM falls between 1/15/2023 4:08:29 PM and 1/24/2023 6:33:57 AM. IsImprovementStdDev: Marked as improvement because 118.98491910025687 (T) = (0 -4.682614312353013) / Math.Sqrt((0.012388830354185339 / (299)) + (0.0013208139577452506 / (17))) is greater than 1.9675476980854363 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (299) + (17) - 2, .975) and 0.21712310305116367 = (5.98129071199177 - 4.682614312353013) / 5.98129071199177 is greater than 0.05. IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so. ```### Baseline Jit Disasm ```assembly ; System.Tests.Perf_UInt32.TryFormat(UInt32) push ebp mov ebp,esp push edi push esi push eax xor eax,eax mov [ebp-0C],eax mov ecx,[ecx+4] test ecx,ecx je short M00_L01 lea esi,[ecx+8] mov edi,[ecx+4] M00_L00: mov ecx,edx push edi push esi lea edx,[ebp-0C] call dword ptr ds:[8F7B888]; System.Number.TryUInt32ToDecStr(UInt32, System.Span`1, Int32 ByRef) pop ecx pop esi pop edi pop ebp ret M00_L01: xor esi,esi xor edi,edi jmp short M00_L00 ; Total bytes of code 48 ``` ```assembly ; System.Number.TryUInt32ToDecStr(UInt32, System.Span`1, Int32 ByRef) push ebp mov ebp,esp push esi push eax xor eax,eax mov [ebp-8],eax mov eax,ecx or eax,1 lzcnt eax,eax xor eax,1F lea eax,[eax*8+6B807C34] mov esi,[eax] mov eax,[eax+4] add esi,ecx adc eax,0 cmp eax,[ebp+0C] jg short M01_L07 mov [edx],eax mov edx,[ebp+8] mov [ebp-8],edx lea esi,[edx+eax*2] cmp ecx,0A jb short M01_L05 cmp ecx,64 jb short M01_L04 M01_L00: add esi,0FFFFFFFC mov edx,51EB851F mov eax,ecx mul edx shr edx,5 imul eax,edx,64 sub ecx,eax mov eax,89312C0 mov eax,[eax+ecx*4+8] mov [esi],eax cmp edx,64 jae short M01_L03 M01_L01: cmp edx,0A jb short M01_L02 add esi,0FFFFFFFC mov eax,89312C0 mov edx,[eax+edx*4+8] mov [esi],edx jmp short M01_L06 M01_L02: mov ecx,edx jmp short M01_L05 M01_L03: mov ecx,edx jmp short M01_L00 M01_L04: mov edx,ecx jmp short M01_L01 M01_L05: lea eax,[ecx+30] mov [esi-2],ax M01_L06: xor eax,eax mov [ebp-8],eax mov eax,1 pop ecx pop esi pop ebp ret 8 M01_L07: xor eax,eax mov [edx],eax pop ecx pop esi pop ebp ret 8 ; Total bytes of code 167 ``` ### Compare Jit Disasm ```assembly ; System.Tests.Perf_UInt32.TryFormat(UInt32) push ebp mov ebp,esp push edi push esi sub esp,8 xor eax,eax mov [ebp-0C],eax mov [ebp-10],eax mov eax,[ecx+4] test eax,eax je near ptr M00_L10 lea ecx,[eax+8] mov esi,[eax+4] M00_L00: mov edi,edx mov eax,edi or eax,1 lzcnt eax,eax xor eax,1F lea eax,[eax*8+6AF86D50] mov edx,[eax] mov eax,[eax+4] add edx,edi adc eax,0 cmp eax,esi jg short M00_L08 mov [ebp-0C],eax mov [ebp-10],ecx lea ecx,[ecx+eax*2] cmp edi,0A jb short M00_L06 cmp edi,64 jb short M00_L05 M00_L01: add ecx,0FFFFFFFC mov edx,51EB851F mov eax,edi mul edx shr edx,5 imul eax,edx,64 sub edi,eax mov eax,8171224 mov eax,[eax+edi*4+8] mov [ecx],eax cmp edx,64 jae short M00_L04 M00_L02: cmp edx,0A jb short M00_L03 add ecx,0FFFFFFFC mov eax,8171224 mov edx,[eax+edx*4+8] mov [ecx],edx jmp short M00_L07 M00_L03: mov edi,edx jmp short M00_L06 M00_L04: mov edi,edx jmp short M00_L01 M00_L05: mov edx,edi jmp short M00_L02 M00_L06: lea eax,[edi+30] mov [ecx-2],ax M00_L07: xor eax,eax mov [ebp-10],eax mov eax,1 jmp short M00_L09 M00_L08: xor eax,eax mov [ebp-0C],eax M00_L09: xor edx,edx mov [ebp-10],edx lea esp,[ebp-8] pop esi pop edi pop ebp ret M00_L10: xor ecx,ecx xor esi,esi jmp near ptr M00_L00 ; Total bytes of code 201 ``` #### System.Tests.Perf_UInt32.TryFormat(value: 4294967295) ```log ``` ### Description of detection logic ```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. 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 7.113846838497401 < 7.982542985689014. IsChangePoint: Marked as a change because one of 1/21/2023 1:51:00 AM, 1/24/2023 6:33:57 AM falls between 1/15/2023 4:08:29 PM and 1/24/2023 6:33:57 AM. IsImprovementStdDev: Marked as improvement because 152.70476484930336 (T) = (0 -7.098688810306198) / Math.Sqrt((0.010514601916691187 / (299)) + (0.0006550113705709149 / (17))) is greater than 1.9675476980854363 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (299) + (17) - 2, .975) and 0.15588306709224847 = (8.409603614813365 - 7.098688810306198) / 8.409603614813365 is greater than 0.05. IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so. ```### Baseline Jit Disasm ```assembly ; System.Tests.Perf_UInt32.TryFormat(UInt32) push ebp mov ebp,esp push edi push esi push eax xor eax,eax mov [ebp-0C],eax mov ecx,[ecx+4] test ecx,ecx je short M00_L01 lea esi,[ecx+8] mov edi,[ecx+4] M00_L00: mov ecx,edx push edi push esi lea edx,[ebp-0C] call dword ptr ds:[8A0B888]; System.Number.TryUInt32ToDecStr(UInt32, System.Span`1, Int32 ByRef) pop ecx pop esi pop edi pop ebp ret M00_L01: xor esi,esi xor edi,edi jmp short M00_L00 ; Total bytes of code 48 ``` ```assembly ; System.Number.TryUInt32ToDecStr(UInt32, System.Span`1, Int32 ByRef) push ebp mov ebp,esp push esi push eax xor eax,eax mov [ebp-8],eax mov eax,ecx or eax,1 lzcnt eax,eax xor eax,1F lea eax,[eax*8+6B807C34] mov esi,[eax] mov eax,[eax+4] add esi,ecx adc eax,0 cmp eax,[ebp+0C] jg short M01_L07 mov [edx],eax mov edx,[ebp+8] mov [ebp-8],edx lea esi,[edx+eax*2] cmp ecx,0A jb short M01_L05 cmp ecx,64 jb short M01_L04 M01_L00: add esi,0FFFFFFFC mov edx,51EB851F mov eax,ecx mul edx shr edx,5 imul eax,edx,64 sub ecx,eax mov eax,83C12C0 mov eax,[eax+ecx*4+8] mov [esi],eax cmp edx,64 jae short M01_L03 M01_L01: cmp edx,0A jb short M01_L02 add esi,0FFFFFFFC mov eax,83C12C0 mov edx,[eax+edx*4+8] mov [esi],edx jmp short M01_L06 M01_L02: mov ecx,edx jmp short M01_L05 M01_L03: mov ecx,edx jmp short M01_L00 M01_L04: mov edx,ecx jmp short M01_L01 M01_L05: lea eax,[ecx+30] mov [esi-2],ax M01_L06: xor eax,eax mov [ebp-8],eax mov eax,1 pop ecx pop esi pop ebp ret 8 M01_L07: xor eax,eax mov [edx],eax pop ecx pop esi pop ebp ret 8 ; Total bytes of code 167 ``` ### Compare Jit Disasm ```assembly ; System.Tests.Perf_UInt32.TryFormat(UInt32) push ebp mov ebp,esp push edi push esi sub esp,8 xor eax,eax mov [ebp-0C],eax mov [ebp-10],eax mov eax,[ecx+4] test eax,eax je near ptr M00_L10 lea ecx,[eax+8] mov esi,[eax+4] M00_L00: mov edi,edx mov eax,edi or eax,1 lzcnt eax,eax xor eax,1F lea eax,[eax*8+6AF86D50] mov edx,[eax] mov eax,[eax+4] add edx,edi adc eax,0 cmp eax,esi jg short M00_L08 mov [ebp-0C],eax mov [ebp-10],ecx lea ecx,[ecx+eax*2] cmp edi,0A jb short M00_L06 cmp edi,64 jb short M00_L05 M00_L01: add ecx,0FFFFFFFC mov edx,51EB851F mov eax,edi mul edx shr edx,5 imul eax,edx,64 sub edi,eax mov eax,7BB1224 mov eax,[eax+edi*4+8] mov [ecx],eax cmp edx,64 jae short M00_L04 M00_L02: cmp edx,0A jb short M00_L03 add ecx,0FFFFFFFC mov eax,7BB1224 mov edx,[eax+edx*4+8] mov [ecx],edx jmp short M00_L07 M00_L03: mov edi,edx jmp short M00_L06 M00_L04: mov edi,edx jmp short M00_L01 M00_L05: mov edx,edi jmp short M00_L02 M00_L06: lea eax,[edi+30] mov [ecx-2],ax M00_L07: xor eax,eax mov [ebp-10],eax mov eax,1 jmp short M00_L09 M00_L08: xor eax,eax mov [ebp-0C],eax M00_L09: xor edx,edx mov [ebp-10],edx lea esp,[ebp-8] pop esi pop edi pop ebp ret M00_L10: xor ecx,ecx xor esi,esi jmp near ptr M00_L00 ; Total bytes of code 201 ``` ### Docs [Profiling workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/profiling-workflow-dotnet-runtime.md) [Benchmarking workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/benchmarking-workflow-dotnet-runtime.md)

Run Information

Architecture x86
OS Windows 10.0.18362
Baseline ff12237f483eb0afdabf1aeb71b69ff992d6bd40
Compare 7ec3634ee579d89b6024f72b595bfd7118093fc5
Diff Diff

Improvements in System.Memory.Span<Char>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
[Reverse - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Memory.Span(Char).Reverse(Size%3a%204).html>) 4.28 ns 3.02 ns 0.71 0.17 False

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>.Reverse(Size: 4) ```log ``` ### Description of detection logic ```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. 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 3.0208193089870683 < 4.074201026916172. IsChangePoint: Marked as a change because one of 12/14/2022 5:20:21 PM, 1/21/2023 1:51:00 AM, 1/24/2023 6:33:57 AM falls between 1/15/2023 4:08:29 PM and 1/24/2023 6:33:57 AM. IsImprovementStdDev: Marked as improvement because 60.65444035234069 (T) = (0 -3.025601438244151) / Math.Sqrt((0.1630405259346658 / (224)) + (4.273322539937267E-05 / (17))) is greater than 1.9699394059167992 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (224) + (17) - 2, .975) and 0.3513992057712438 = (4.664813033172214 - 3.025601438244151) / 4.664813033172214 is greater than 0.05. IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so. ``` ### Docs [Profiling workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/profiling-workflow-dotnet-runtime.md) [Benchmarking workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/benchmarking-workflow-dotnet-runtime.md)
performanceautofiler[bot] commented 1 year ago

Run Information

Architecture x86
OS Windows 10.0.18362
Baseline ff12237f483eb0afdabf1aeb71b69ff992d6bd40
Compare 7ec3634ee579d89b6024f72b595bfd7118093fc5
Diff Diff

Improvements in System.Text.RegularExpressions.Tests.Perf_Regex_Common

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
[CtorInvoke - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Text.RegularExpressions.Tests.Perf_Regex_Common.CtorInvoke(Options%3a%20IgnoreCase%2c%20Compiled).html>) 334.90 μs 306.96 μs 0.92 0.00 False 1373495.3703703703 1127876.9841269841 0.8211727599947032 Trace Trace
[CtorInvoke - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Text.RegularExpressions.Tests.Perf_Regex_Common.CtorInvoke(Options%3a%20Compiled).html>) 312.32 μs 287.70 μs 0.92 0.00 False 1323198.1981981983 1071590.9090909092 0.8098491295938104 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 'System.Text.RegularExpressions.Tests.Perf_Regex_Common*'
### Payloads [Baseline]() [Compare]() ### Histogram #### System.Text.RegularExpressions.Tests.Perf_Regex_Common.CtorInvoke(Options: IgnoreCase, Compiled) ```log ``` ### Description of detection logic ```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. 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 306.95784474671666 < 316.1582059459237. IsChangePoint: Marked as a change because one of 1/21/2023 1:51:00 AM, 1/24/2023 6:33:57 AM falls between 1/15/2023 4:08:29 PM and 1/24/2023 6:33:57 AM. IsImprovementStdDev: Marked as improvement because 41.01012376213385 (T) = (0 -308966.85268674383) / Math.Sqrt((5194819.821356694 / (299)) + (5934124.659634094 / (17))) is greater than 1.9675476980854363 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (299) + (17) - 2, .975) and 0.07437322554614835 = (333792.0436334005 - 308966.85268674383) / 333792.0436334005 is greater than 0.05. IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so. ```### Baseline Jit Disasm ```assembly ; System.Text.RegularExpressions.Tests.Perf_Regex_Common.CtorInvoke() push ebp mov ebp,esp push edi push esi mov esi,ecx mov ecx,offset MT_System.Text.RegularExpressions.Regex call CORINFO_HELP_NEWSFAST mov edi,eax push dword ptr [esi+30] mov ecx,edi mov edx,7C4E628 call dword ptr ds:[0A8893C0]; System.Text.RegularExpressions.Regex..ctor(System.String, System.Text.RegularExpressions.RegexOptions) mov ecx,edi test byte ptr [ecx+20],40 jne short M00_L00 xor edx,edx jmp short M00_L01 M00_L00: mov edx,2 M00_L01: push 0FFFFFFFF push 7C4E6C4 push 0 push 2 push edx xor edx,edx call dword ptr ds:[0A889678]; System.Text.RegularExpressions.Regex.RunSingleMatch(System.Text.RegularExpressions.RegexRunnerMode, Int32, System.String, Int32, Int32, Int32) pop esi pop edi pop ebp ret ; Total bytes of code 76 ``` ```assembly ; System.Text.RegularExpressions.Regex..ctor(System.String, System.Text.RegularExpressions.RegexOptions) push ebp mov ebp,esp push dword ptr [ebp+8] mov eax,ds:[69E4D28] add eax,4 push dword ptr [eax+4] push dword ptr [eax] push 0 call dword ptr ds:[0A889408]; System.Text.RegularExpressions.Regex..ctor(System.String, System.Text.RegularExpressions.RegexOptions, System.TimeSpan, System.Globalization.CultureInfo) pop ebp ret 4 ; Total bytes of code 31 ``` ```assembly ; System.Text.RegularExpressions.Regex.RunSingleMatch(System.Text.RegularExpressions.RegexRunnerMode, Int32, System.String, Int32, Int32, Int32) push ebp mov ebp,esp push edi push esi push ebx sub esp,30 xor eax,eax mov [ebp-30],eax mov [ebp-34],eax mov [ebp-18],eax mov [ebp-2C],ecx mov esi,edx mov ebx,[ebp+14] mov edi,[ebp+10] mov [ebp+14],ebx mov edx,[ebx+4] mov [ebp-28],edx mov eax,[ebp+8] cmp edx,eax jb near ptr M02_L14 mov eax,[ebp+0C] cmp edx,eax jb near ptr M02_L15 cmp [ecx],cl lea eax,[ecx+1C] xor ebx,ebx xchg ebx,[eax] test ebx,ebx jne short M02_L00 mov eax,[ecx+8] mov ecx,eax mov eax,[eax] mov eax,[eax+28] call dword ptr [eax+10] mov ebx,eax mov ecx,[ebp-2C] M02_L00: mov [ebp-30],ebx lea eax,[ecx+2C] push dword ptr [eax+4] push dword ptr [eax] mov ecx,ebx cmp [ecx],ecx call dword ptr ds:[0AD1F8A0]; System.Text.RegularExpressions.RegexRunner.InitializeTimeout(System.TimeSpan) lea edx,[ebx+0C] mov eax,[ebp+14] call CORINFO_HELP_ASSIGN_REF_EAX mov ecx,[ebp-28] cmp ecx,edi jb near ptr M02_L08 sub ecx,edi mov edx,[ebp+0C] cmp ecx,edx jb near ptr M02_L08 mov [ebp+14],eax lea ecx,[eax+edi*2+8] mov [ebp-3C],ecx mov [ebp-24],edx push edx push ecx mov eax,[ebp+8] sub eax,edi push eax push esi mov ecx,ebx mov edx,[ebp-2C] call dword ptr ds:[0AD1F888]; System.Text.RegularExpressions.RegexRunner.InitializeForScan(System.Text.RegularExpressions.Regex, System.ReadOnlySpan`1, Int32, System.Text.RegularExpressions.RegexRunnerMode) cmp dword ptr [ebp+18],0 jne short M02_L03 mov ecx,[ebp-24] mov eax,ecx mov edx,1 mov ecx,[ebp-2C] test byte ptr [ecx+20],40 je short M02_L01 xor eax,eax mov edx,0FFFFFFFF M02_L01: cmp [ebx+2C],eax jne short M02_L02 mov edx,ds:[69E4D20] mov [ebp-34],edx mov dword ptr [ebp-1C],0 mov dword ptr [ebp-18],0FC push offset M02_L11 jmp near ptr M02_L12 M02_L02: add [ebx+30],edx M02_L03: push dword ptr [ebp-24] push dword ptr [ebp-3C] mov ecx,ebx mov eax,[ebx] mov eax,[eax+28] call dword ptr [eax+10] mov eax,[ebx+1C] mov [ebp-38],eax mov edx,[eax+2C] cmp dword ptr [edx+4],0 jbe short M02_L04 cmp dword ptr [edx+8],0 jle short M02_L09 test esi,esi je short M02_L05 lea edx,[eax+4] mov ecx,[ebp+14] call CORINFO_HELP_ASSIGN_REF_ECX xor edx,edx mov [ebx+1C],edx jmp short M02_L06 M02_L04: call CORINFO_HELP_RNGCHKFAIL M02_L05: xor edx,edx mov [eax+4],edx jmp short M02_L07 M02_L06: mov edx,[ebx+30] push edi push esi mov ecx,eax call dword ptr ds:[0B459AB0] mov esi,[ebp-38] mov edx,esi M02_L07: mov [ebp-34],edx jmp short M02_L10 M02_L08: mov ecx,21 call dword ptr ds:[82D53A8] int 3 M02_L09: xor edx,edx mov [eax+4],edx mov edx,ds:[69E4D20] jmp short M02_L07 M02_L10: xor edx,edx mov [ebx+0C],edx mov ecx,[ebp-2C] lea edx,[ecx+1C] call CORINFO_HELP_ASSIGN_REF_EBX jmp short M02_L13 M02_L11: mov dword ptr [ebp-18],0 jmp short M02_L13 M02_L12: xor edx,edx mov ebx,[ebp-30] mov [ebx+0C],edx mov ecx,[ebp-2C] lea edx,[ecx+1C] call CORINFO_HELP_ASSIGN_REF_EBX pop eax jmp eax M02_L13: mov eax,[ebp-34] lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret 14 M02_L14: mov ecx,0E xor edx,edx call dword ptr ds:[0ACEBD68] int 3 M02_L15: mov ecx,8 mov edx,2 call dword ptr ds:[0ACEBD68] int 3 ; Total bytes of code 467 ``` ### Compare Jit Disasm ```assembly ; System.Text.RegularExpressions.Tests.Perf_Regex_Common.CtorInvoke() push ebp mov ebp,esp push edi push esi mov esi,ecx mov ecx,offset MT_System.Text.RegularExpressions.Regex call CORINFO_HELP_NEWSFAST mov edi,eax push dword ptr [esi+30] mov ecx,edi mov edx,874E628 call dword ptr ds:[0B3793C0]; System.Text.RegularExpressions.Regex..ctor(System.String, System.Text.RegularExpressions.RegexOptions) mov ecx,edi test byte ptr [ecx+20],40 jne short M00_L00 xor edx,edx jmp short M00_L01 M00_L00: mov edx,2 M00_L01: push 0FFFFFFFF push 874E6C4 push 0 push 2 push edx xor edx,edx call dword ptr ds:[0B379678]; System.Text.RegularExpressions.Regex.RunSingleMatch(System.Text.RegularExpressions.RegexRunnerMode, Int32, System.String, Int32, Int32, Int32) pop esi pop edi pop ebp ret ; Total bytes of code 76 ``` ```assembly ; System.Text.RegularExpressions.Regex..ctor(System.String, System.Text.RegularExpressions.RegexOptions) push ebp mov ebp,esp push dword ptr [ebp+8] mov eax,ds:[75C4D28] add eax,4 push dword ptr [eax+4] push dword ptr [eax] push 0 call dword ptr ds:[0B379408]; System.Text.RegularExpressions.Regex..ctor(System.String, System.Text.RegularExpressions.RegexOptions, System.TimeSpan, System.Globalization.CultureInfo) pop ebp ret 4 ; Total bytes of code 31 ``` ```assembly ; System.Text.RegularExpressions.Regex.RunSingleMatch(System.Text.RegularExpressions.RegexRunnerMode, Int32, System.String, Int32, Int32, Int32) push ebp mov ebp,esp push edi push esi push ebx sub esp,30 xor eax,eax mov [ebp-30],eax mov [ebp-34],eax mov [ebp-18],eax mov [ebp-2C],ecx mov esi,edx mov ebx,[ebp+14] mov edi,[ebp+10] mov [ebp+14],ebx mov edx,[ebx+4] mov [ebp-28],edx mov eax,[ebp+8] cmp edx,eax jb near ptr M02_L14 mov eax,[ebp+0C] cmp edx,eax jb near ptr M02_L15 cmp [ecx],cl lea eax,[ecx+1C] xor ebx,ebx xchg ebx,[eax] test ebx,ebx jne short M02_L00 mov eax,[ecx+8] mov ecx,eax mov eax,[eax] mov eax,[eax+28] call dword ptr [eax+10] mov ebx,eax mov ecx,[ebp-2C] M02_L00: mov [ebp-30],ebx lea eax,[ecx+2C] push dword ptr [eax+4] push dword ptr [eax] mov ecx,ebx cmp [ecx],ecx call dword ptr ds:[0B80F8A0]; System.Text.RegularExpressions.RegexRunner.InitializeTimeout(System.TimeSpan) lea edx,[ebx+0C] mov eax,[ebp+14] call CORINFO_HELP_ASSIGN_REF_EAX mov ecx,[ebp-28] cmp ecx,edi jb near ptr M02_L08 sub ecx,edi mov edx,[ebp+0C] cmp ecx,edx jb near ptr M02_L08 mov [ebp+14],eax lea ecx,[eax+edi*2+8] mov [ebp-3C],ecx mov [ebp-24],edx push edx push ecx mov eax,[ebp+8] sub eax,edi push eax push esi mov ecx,ebx mov edx,[ebp-2C] call dword ptr ds:[0B80F888]; System.Text.RegularExpressions.RegexRunner.InitializeForScan(System.Text.RegularExpressions.Regex, System.ReadOnlySpan`1, Int32, System.Text.RegularExpressions.RegexRunnerMode) cmp dword ptr [ebp+18],0 jne short M02_L03 mov ecx,[ebp-24] mov eax,ecx mov edx,1 mov ecx,[ebp-2C] test byte ptr [ecx+20],40 je short M02_L01 xor eax,eax mov edx,0FFFFFFFF M02_L01: cmp [ebx+2C],eax jne short M02_L02 mov edx,ds:[75C4D20] mov [ebp-34],edx mov dword ptr [ebp-1C],0 mov dword ptr [ebp-18],0FC push offset M02_L11 jmp near ptr M02_L12 M02_L02: add [ebx+30],edx M02_L03: push dword ptr [ebp-24] push dword ptr [ebp-3C] mov ecx,ebx mov eax,[ebx] mov eax,[eax+28] call dword ptr [eax+10] mov eax,[ebx+1C] mov [ebp-38],eax mov edx,[eax+2C] cmp dword ptr [edx+4],0 jbe short M02_L04 cmp dword ptr [edx+8],0 jle short M02_L09 test esi,esi je short M02_L05 lea edx,[eax+4] mov ecx,[ebp+14] call CORINFO_HELP_ASSIGN_REF_ECX xor edx,edx mov [ebx+1C],edx jmp short M02_L06 M02_L04: call CORINFO_HELP_RNGCHKFAIL M02_L05: xor edx,edx mov [eax+4],edx jmp short M02_L07 M02_L06: mov edx,[ebx+30] push edi push esi mov ecx,eax call dword ptr ds:[0BF07C18] mov esi,[ebp-38] mov edx,esi M02_L07: mov [ebp-34],edx jmp short M02_L10 M02_L08: mov ecx,21 call dword ptr ds:[8DE53A8] int 3 M02_L09: xor edx,edx mov [eax+4],edx mov edx,ds:[75C4D20] jmp short M02_L07 M02_L10: xor edx,edx mov [ebx+0C],edx mov ecx,[ebp-2C] lea edx,[ecx+1C] call CORINFO_HELP_ASSIGN_REF_EBX jmp short M02_L13 M02_L11: mov dword ptr [ebp-18],0 jmp short M02_L13 M02_L12: xor edx,edx mov ebx,[ebp-30] mov [ebx+0C],edx mov ecx,[ebp-2C] lea edx,[ecx+1C] call CORINFO_HELP_ASSIGN_REF_EBX pop eax jmp eax M02_L13: mov eax,[ebp-34] lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret 14 M02_L14: mov ecx,0E xor edx,edx call dword ptr ds:[0B7FBD68] int 3 M02_L15: mov ecx,8 mov edx,2 call dword ptr ds:[0B7FBD68] int 3 ; Total bytes of code 467 ``` #### System.Text.RegularExpressions.Tests.Perf_Regex_Common.CtorInvoke(Options: Compiled) ```log ``` ### Description of detection logic ```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. 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 287.6967669753087 < 297.95614865451387. IsChangePoint: Marked as a change because one of 1/21/2023 1:51:00 AM, 1/24/2023 6:33:57 AM falls between 1/15/2023 4:08:29 PM and 1/24/2023 6:33:57 AM. IsImprovementStdDev: Marked as improvement because 47.74031287495516 (T) = (0 -289483.24685865216) / Math.Sqrt((6062076.127456782 / (299)) + (3166939.396548353 / (17))) is greater than 1.9675476980854363 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (299) + (17) - 2, .975) and 0.06972695345356363 = (311180.94621072314 - 289483.24685865216) / 311180.94621072314 is greater than 0.05. IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so. ```### Baseline Jit Disasm ```assembly ; System.Text.RegularExpressions.Tests.Perf_Regex_Common.CtorInvoke() push ebp mov ebp,esp push edi push esi mov esi,ecx mov ecx,offset MT_System.Text.RegularExpressions.Regex call CORINFO_HELP_NEWSFAST mov edi,eax push dword ptr [esi+30] mov ecx,edi mov edx,875E600 call dword ptr ds:[0B3993C0]; System.Text.RegularExpressions.Regex..ctor(System.String, System.Text.RegularExpressions.RegexOptions) mov ecx,edi test byte ptr [ecx+20],40 jne short M00_L00 xor edx,edx jmp short M00_L01 M00_L00: mov edx,2 M00_L01: push 0FFFFFFFF push 875E69C push 0 push 2 push edx xor edx,edx call dword ptr ds:[0B399678]; System.Text.RegularExpressions.Regex.RunSingleMatch(System.Text.RegularExpressions.RegexRunnerMode, Int32, System.String, Int32, Int32, Int32) pop esi pop edi pop ebp ret ; Total bytes of code 76 ``` ```assembly ; System.Text.RegularExpressions.Regex..ctor(System.String, System.Text.RegularExpressions.RegexOptions) push ebp mov ebp,esp push dword ptr [ebp+8] mov eax,ds:[75D4D28] add eax,4 push dword ptr [eax+4] push dword ptr [eax] push 0 call dword ptr ds:[0B399408]; System.Text.RegularExpressions.Regex..ctor(System.String, System.Text.RegularExpressions.RegexOptions, System.TimeSpan, System.Globalization.CultureInfo) pop ebp ret 4 ; Total bytes of code 31 ``` ```assembly ; System.Text.RegularExpressions.Regex.RunSingleMatch(System.Text.RegularExpressions.RegexRunnerMode, Int32, System.String, Int32, Int32, Int32) push ebp mov ebp,esp push edi push esi push ebx sub esp,30 xor eax,eax mov [ebp-30],eax mov [ebp-34],eax mov [ebp-18],eax mov [ebp-2C],ecx mov esi,edx mov ebx,[ebp+14] mov edi,[ebp+10] mov [ebp+14],ebx mov edx,[ebx+4] mov [ebp-28],edx mov eax,[ebp+8] cmp edx,eax jb near ptr M02_L14 mov eax,[ebp+0C] cmp edx,eax jb near ptr M02_L15 cmp [ecx],cl lea eax,[ecx+1C] xor ebx,ebx xchg ebx,[eax] test ebx,ebx jne short M02_L00 mov eax,[ecx+8] mov ecx,eax mov eax,[eax] mov eax,[eax+28] call dword ptr [eax+10] mov ebx,eax mov ecx,[ebp-2C] M02_L00: mov [ebp-30],ebx lea eax,[ecx+2C] push dword ptr [eax+4] push dword ptr [eax] mov ecx,ebx cmp [ecx],ecx call dword ptr ds:[0B82D9F0]; System.Text.RegularExpressions.RegexRunner.InitializeTimeout(System.TimeSpan) lea edx,[ebx+0C] mov eax,[ebp+14] call CORINFO_HELP_ASSIGN_REF_EAX mov ecx,[ebp-28] cmp ecx,edi jb near ptr M02_L08 sub ecx,edi mov edx,[ebp+0C] cmp ecx,edx jb near ptr M02_L08 mov [ebp+14],eax lea ecx,[eax+edi*2+8] mov [ebp-3C],ecx mov [ebp-24],edx push edx push ecx mov eax,[ebp+8] sub eax,edi push eax push esi mov ecx,ebx mov edx,[ebp-2C] call dword ptr ds:[0B82D9D8]; System.Text.RegularExpressions.RegexRunner.InitializeForScan(System.Text.RegularExpressions.Regex, System.ReadOnlySpan`1, Int32, System.Text.RegularExpressions.RegexRunnerMode) cmp dword ptr [ebp+18],0 jne short M02_L03 mov ecx,[ebp-24] mov eax,ecx mov edx,1 mov ecx,[ebp-2C] test byte ptr [ecx+20],40 je short M02_L01 xor eax,eax mov edx,0FFFFFFFF M02_L01: cmp [ebx+2C],eax jne short M02_L02 mov edx,ds:[75D4D20] mov [ebp-34],edx mov dword ptr [ebp-1C],0 mov dword ptr [ebp-18],0FC push offset M02_L11 jmp near ptr M02_L12 M02_L02: add [ebx+30],edx M02_L03: push dword ptr [ebp-24] push dword ptr [ebp-3C] mov ecx,ebx mov eax,[ebx] mov eax,[eax+28] call dword ptr [eax+10] mov eax,[ebx+1C] mov [ebp-38],eax mov edx,[eax+2C] cmp dword ptr [edx+4],0 jbe short M02_L04 cmp dword ptr [edx+8],0 jle short M02_L09 test esi,esi je short M02_L05 lea edx,[eax+4] mov ecx,[ebp+14] call CORINFO_HELP_ASSIGN_REF_ECX xor edx,edx mov [ebx+1C],edx jmp short M02_L06 M02_L04: call CORINFO_HELP_RNGCHKFAIL M02_L05: xor edx,edx mov [eax+4],edx jmp short M02_L07 M02_L06: mov edx,[ebx+30] push edi push esi mov ecx,eax call dword ptr ds:[0BF87210] mov esi,[ebp-38] mov edx,esi M02_L07: mov [ebp-34],edx jmp short M02_L10 M02_L08: mov ecx,21 call dword ptr ds:[8DE53A8] int 3 M02_L09: xor edx,edx mov [eax+4],edx mov edx,ds:[75D4D20] jmp short M02_L07 M02_L10: xor edx,edx mov [ebx+0C],edx mov ecx,[ebp-2C] lea edx,[ecx+1C] call CORINFO_HELP_ASSIGN_REF_EBX jmp short M02_L13 M02_L11: mov dword ptr [ebp-18],0 jmp short M02_L13 M02_L12: xor edx,edx mov ebx,[ebp-30] mov [ebx+0C],edx mov ecx,[ebp-2C] lea edx,[ecx+1C] call CORINFO_HELP_ASSIGN_REF_EBX pop eax jmp eax M02_L13: mov eax,[ebp-34] lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret 14 M02_L14: mov ecx,0E xor edx,edx call dword ptr ds:[0B7FBD68] int 3 M02_L15: mov ecx,8 mov edx,2 call dword ptr ds:[0B7FBD68] int 3 ; Total bytes of code 467 ``` ### Compare Jit Disasm ```assembly ; System.Text.RegularExpressions.Tests.Perf_Regex_Common.CtorInvoke() push ebp mov ebp,esp push edi push esi mov esi,ecx mov ecx,offset MT_System.Text.RegularExpressions.Regex call CORINFO_HELP_NEWSFAST mov edi,eax push dword ptr [esi+30] mov ecx,edi mov edx,8ADE600 call dword ptr ds:[0B7293C0]; System.Text.RegularExpressions.Regex..ctor(System.String, System.Text.RegularExpressions.RegexOptions) mov ecx,edi test byte ptr [ecx+20],40 jne short M00_L00 xor edx,edx jmp short M00_L01 M00_L00: mov edx,2 M00_L01: push 0FFFFFFFF push 8ADE69C push 0 push 2 push edx xor edx,edx call dword ptr ds:[0B729678]; System.Text.RegularExpressions.Regex.RunSingleMatch(System.Text.RegularExpressions.RegexRunnerMode, Int32, System.String, Int32, Int32, Int32) pop esi pop edi pop ebp ret ; Total bytes of code 76 ``` ```assembly ; System.Text.RegularExpressions.Regex..ctor(System.String, System.Text.RegularExpressions.RegexOptions) push ebp mov ebp,esp push dword ptr [ebp+8] mov eax,ds:[7774D28] add eax,4 push dword ptr [eax+4] push dword ptr [eax] push 0 call dword ptr ds:[0B729408]; System.Text.RegularExpressions.Regex..ctor(System.String, System.Text.RegularExpressions.RegexOptions, System.TimeSpan, System.Globalization.CultureInfo) pop ebp ret 4 ; Total bytes of code 31 ``` ```assembly ; System.Text.RegularExpressions.Regex.RunSingleMatch(System.Text.RegularExpressions.RegexRunnerMode, Int32, System.String, Int32, Int32, Int32) push ebp mov ebp,esp push edi push esi push ebx sub esp,30 xor eax,eax mov [ebp-30],eax mov [ebp-34],eax mov [ebp-18],eax mov [ebp-2C],ecx mov esi,edx mov ebx,[ebp+14] mov edi,[ebp+10] mov [ebp+14],ebx mov edx,[ebx+4] mov [ebp-28],edx mov eax,[ebp+8] cmp edx,eax jb near ptr M02_L14 mov eax,[ebp+0C] cmp edx,eax jb near ptr M02_L15 cmp [ecx],cl lea eax,[ecx+1C] xor ebx,ebx xchg ebx,[eax] test ebx,ebx jne short M02_L00 mov eax,[ecx+8] mov ecx,eax mov eax,[eax] mov eax,[eax+28] call dword ptr [eax+10] mov ebx,eax mov ecx,[ebp-2C] M02_L00: mov [ebp-30],ebx lea eax,[ecx+2C] push dword ptr [eax+4] push dword ptr [eax] mov ecx,ebx cmp [ecx],ecx call dword ptr ds:[0BBBF8A0]; System.Text.RegularExpressions.RegexRunner.InitializeTimeout(System.TimeSpan) lea edx,[ebx+0C] mov eax,[ebp+14] call CORINFO_HELP_ASSIGN_REF_EAX mov ecx,[ebp-28] cmp ecx,edi jb near ptr M02_L08 sub ecx,edi mov edx,[ebp+0C] cmp ecx,edx jb near ptr M02_L08 mov [ebp+14],eax lea ecx,[eax+edi*2+8] mov [ebp-3C],ecx mov [ebp-24],edx push edx push ecx mov eax,[ebp+8] sub eax,edi push eax push esi mov ecx,ebx mov edx,[ebp-2C] call dword ptr ds:[0BBBF888]; System.Text.RegularExpressions.RegexRunner.InitializeForScan(System.Text.RegularExpressions.Regex, System.ReadOnlySpan`1, Int32, System.Text.RegularExpressions.RegexRunnerMode) cmp dword ptr [ebp+18],0 jne short M02_L03 mov ecx,[ebp-24] mov eax,ecx mov edx,1 mov ecx,[ebp-2C] test byte ptr [ecx+20],40 je short M02_L01 xor eax,eax mov edx,0FFFFFFFF M02_L01: cmp [ebx+2C],eax jne short M02_L02 mov edx,ds:[7774D20] mov [ebp-34],edx mov dword ptr [ebp-1C],0 mov dword ptr [ebp-18],0FC push offset M02_L11 jmp near ptr M02_L12 M02_L02: add [ebx+30],edx M02_L03: push dword ptr [ebp-24] push dword ptr [ebp-3C] mov ecx,ebx mov eax,[ebx] mov eax,[eax+28] call dword ptr [eax+10] mov eax,[ebx+1C] mov [ebp-38],eax mov edx,[eax+2C] cmp dword ptr [edx+4],0 jbe short M02_L04 cmp dword ptr [edx+8],0 jle short M02_L09 test esi,esi je short M02_L05 lea edx,[eax+4] mov ecx,[ebp+14] call CORINFO_HELP_ASSIGN_REF_ECX xor edx,edx mov [ebx+1C],edx jmp short M02_L06 M02_L04: call CORINFO_HELP_RNGCHKFAIL M02_L05: xor edx,edx mov [eax+4],edx jmp short M02_L07 M02_L06: mov edx,[ebx+30] push edi push esi mov ecx,eax call dword ptr ds:[0C2F7210] mov esi,[ebp-38] mov edx,esi M02_L07: mov [ebp-34],edx jmp short M02_L10 M02_L08: mov ecx,21 call dword ptr ds:[91953A8] int 3 M02_L09: xor edx,edx mov [eax+4],edx mov edx,ds:[7774D20] jmp short M02_L07 M02_L10: xor edx,edx mov [ebx+0C],edx mov ecx,[ebp-2C] lea edx,[ecx+1C] call CORINFO_HELP_ASSIGN_REF_EBX jmp short M02_L13 M02_L11: mov dword ptr [ebp-18],0 jmp short M02_L13 M02_L12: xor edx,edx mov ebx,[ebp-30] mov [ebx+0C],edx mov ecx,[ebp-2C] lea edx,[ecx+1C] call CORINFO_HELP_ASSIGN_REF_EBX pop eax jmp eax M02_L13: mov eax,[ebp-34] lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret 14 M02_L14: mov ecx,0E xor edx,edx call dword ptr ds:[0BBABD68] int 3 M02_L15: mov ecx,8 mov edx,2 call dword ptr ds:[0BBABD68] int 3 ; Total bytes of code 467 ``` ### Docs [Profiling workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/profiling-workflow-dotnet-runtime.md) [Benchmarking workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/benchmarking-workflow-dotnet-runtime.md)

Run Information

Architecture x86
OS Windows 10.0.18362
Baseline ff12237f483eb0afdabf1aeb71b69ff992d6bd40
Compare 7ec3634ee579d89b6024f72b595bfd7118093fc5
Diff Diff

Improvements in System.Tests.Perf_UInt64

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
[TryFormat - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Tests.Perf_UInt64.TryFormat(value%3a%2012345).html>) 11.25 ns 9.15 ns 0.81 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 'System.Tests.Perf_UInt64*'
### Payloads [Baseline]() [Compare]() ### Histogram #### System.Tests.Perf_UInt64.TryFormat(value: 12345) ```log ``` ### Description of detection logic ```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. 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 9.15111347521668 < 9.990810818006207. IsChangePoint: Marked as a change because one of 1/21/2023 1:51:00 AM, 1/24/2023 6:33:57 AM falls between 1/15/2023 4:08:29 PM and 1/24/2023 6:33:57 AM. IsImprovementStdDev: Marked as improvement because 57.57265603900669 (T) = (0 -9.087681509308522) / Math.Sqrt((0.02288495923271687 / (299)) + (0.009194961509684215 / (17))) is greater than 1.9675476980854363 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (299) + (17) - 2, .975) and 0.13600751922073193 = (10.518241433203206 - 9.087681509308522) / 10.518241433203206 is greater than 0.05. IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so. ```### Baseline Jit Disasm ```assembly ; System.Tests.Perf_UInt64.TryFormat(UInt64) push ebp mov ebp,esp push edi push esi push eax xor eax,eax mov [ebp-0C],eax mov ecx,[ecx+4] test ecx,ecx je short M00_L01 lea esi,[ecx+8] mov edi,[ecx+4] M00_L00: mov ecx,[ebp+8] mov eax,[ebp+0C] push eax push ecx push edi push esi lea ecx,[ebp-0C] call dword ptr ds:[8CDBA08]; System.Number.TryUInt64ToDecStr(UInt64, System.Span`1, Int32 ByRef) pop ecx pop esi pop edi pop ebp ret 8 M00_L01: xor esi,esi xor edi,edi jmp short M00_L00 ; Total bytes of code 56 ``` ```assembly ; System.Number.TryUInt64ToDecStr(UInt64, System.Span`1, Int32 ByRef) push ebp mov ebp,esp push esi push eax xor eax,eax mov [ebp-8],eax mov eax,5CBE261C mov edx,[ebp+10] mov esi,[ebp+14] or edx,1 or esi,0 jne short M01_L00 or edx,1 lzcnt edx,edx xor edx,1F jmp short M01_L01 M01_L00: or esi,1 xor edx,edx lzcnt edx,esi xor edx,1F add edx,20 M01_L01: movzx eax,byte ptr [eax+edx] lea edx,[eax*8+5CBE872C] mov esi,[edx] mov edx,[edx+4] cmp [ebp+10],esi mov esi,[ebp+14] sbb esi,edx setb dl movzx edx,dl sub eax,edx cmp eax,[ebp+0C] jg short M01_L02 mov [ecx],eax mov ecx,[ebp+8] mov [ebp-8],ecx lea ecx,[ecx+eax*2] push dword ptr [ebp+14] push dword ptr [ebp+10] call dword ptr ds:[8CDB9A8]; System.Number.UInt64ToDecChars(Char*, UInt64) xor eax,eax mov [ebp-8],eax mov eax,1 pop ecx pop esi pop ebp ret 10 M01_L02: xor eax,eax mov [ecx],eax pop ecx pop esi pop ebp ret 10 ; Total bytes of code 142 ``` ### Compare Jit Disasm ```assembly ; System.Tests.Perf_UInt64.TryFormat(UInt64) push ebp mov ebp,esp push edi push esi push ebx sub esp,0C xor eax,eax mov [ebp-10],eax mov [ebp-14],eax mov ecx,[ecx+4] test ecx,ecx je near ptr M00_L05 lea esi,[ecx+8] mov edi,[ecx+4] M00_L00: mov ecx,[ebp+8] mov eax,[ebp+0C] mov [ebp-18],esi mov edx,6B8A164C mov ebx,ecx or ebx,1 mov esi,eax or esi,0 jne short M00_L01 or ebx,1 lzcnt ebx,ebx xor ebx,1F jmp short M00_L02 M00_L01: or esi,1 xor ebx,ebx lzcnt ebx,esi xor ebx,1F add ebx,20 M00_L02: movzx edx,byte ptr [edx+ebx] lea esi,[edx*8+6B8A7FD8] mov ebx,[esi] mov esi,[esi+4] cmp ecx,ebx mov ebx,eax sbb ebx,esi setb bl movzx ebx,bl sub edx,ebx cmp edx,edi jg short M00_L03 mov [ebp-10],edx mov esi,[ebp-18] mov [ebp-14],esi lea edx,[esi+edx*2] push eax push ecx mov ecx,edx call dword ptr ds:[86FB5B8]; System.Number.UInt64ToDecChars(Char*, UInt64) xor eax,eax mov [ebp-14],eax mov eax,1 jmp short M00_L04 M00_L03: xor eax,eax mov [ebp-10],eax M00_L04: xor edx,edx mov [ebp-14],edx lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret 8 M00_L05: xor esi,esi xor edi,edi jmp near ptr M00_L00 ; Total bytes of code 184 ``` ```assembly ; System.Number.UInt64ToDecChars(Char*, UInt64) push ebp mov ebp,esp push edi push esi push ebx mov esi,ecx M01_L00: cmp dword ptr [ebp+0C],0 jne short M01_L08 mov ecx,[ebp+8] cmp ecx,0A jb short M01_L06 cmp ecx,64 jb short M01_L05 M01_L01: add esi,0FFFFFFFC mov edx,51EB851F mov eax,ecx mul edx shr edx,5 imul eax,edx,64 sub ecx,eax mov eax,80D1224 mov eax,[eax+ecx*4+8] mov [esi],eax cmp edx,64 jae short M01_L04 M01_L02: cmp edx,0A jb short M01_L03 add esi,0FFFFFFFC mov eax,80D1224 mov edx,[eax+edx*4+8] mov [esi],edx jmp short M01_L07 M01_L03: mov ecx,edx jmp short M01_L06 M01_L04: mov ecx,edx jmp short M01_L01 M01_L05: mov edx,ecx jmp short M01_L02 M01_L06: add esi,0FFFFFFFE lea eax,[ecx+30] mov [esi],ax M01_L07: mov eax,esi pop ebx pop esi pop edi pop ebp ret 8 M01_L08: mov eax,[ebp+8] mov edx,[ebp+0C] mov ecx,3B9ACA00 cmp edx,ecx jb short M01_L09 mov edi,eax mov eax,edx xor edx,edx div ecx mov eax,edi M01_L09: div ecx mov edi,edx push dword ptr [ebp+0C] push dword ptr [ebp+8] push 0 push 3B9ACA00 call CORINFO_HELP_ULDIV mov [ebp+8],eax mov [ebp+0C],edx mov ecx,esi mov esi,9 cmp edi,64 jb short M01_L11 M01_L10: add ecx,0FFFFFFFC add esi,0FFFFFFFE mov edx,51EB851F mov eax,edi mul edx shr edx,5 imul eax,edx,64 sub edi,eax mov eax,80D1224 mov eax,[eax+edi*4+8] mov [ecx],eax cmp edx,64 mov edi,edx jae short M01_L10 M01_L11: test edi,edi je short M01_L13 M01_L12: dec esi mov edx,0CCCCCCCD mov eax,edi mul edx shr edx,3 lea eax,[edx+edx*4] add eax,eax mov ebx,edi sub ebx,eax mov edi,edx add ecx,0FFFFFFFE add ebx,30 mov [ecx],bx test edi,edi jne short M01_L12 M01_L13: test esi,esi jg short M01_L12 mov esi,ecx jmp near ptr M01_L00 ; Total bytes of code 272 ``` ### Docs [Profiling workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/profiling-workflow-dotnet-runtime.md) [Benchmarking workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/benchmarking-workflow-dotnet-runtime.md)
performanceautofiler[bot] commented 1 year ago

Run Information

Architecture x86
OS Windows 10.0.18362
Baseline ff12237f483eb0afdabf1aeb71b69ff992d6bd40
Compare 7ec3634ee579d89b6024f72b595bfd7118093fc5
Diff Diff

Improvements in System.Tests.Perf_Int64

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
[TryFormat - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Tests.Perf_Int64.TryFormat(value%3a%2012345).html>) 12.05 ns 9.99 ns 0.83 0.01 False 123.39667753482313 114.32967235299122 0.92652148045661 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_Int64*'
### Payloads [Baseline]() [Compare]() ### Histogram #### System.Tests.Perf_Int64.TryFormat(value: 12345) ```log ``` ### Description of detection logic ```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. 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 9.985555103337752 < 11.318682124222223. IsChangePoint: Marked as a change because one of 1/21/2023 1:51:00 AM, 1/24/2023 6:33:57 AM falls between 1/15/2023 4:08:29 PM and 1/24/2023 6:33:57 AM. IsImprovementStdDev: Marked as improvement because 195.3544082876163 (T) = (0 -9.971265582465612) / Math.Sqrt((0.012448007468690705 / (299)) + (0.0009665462346711482 / (17))) is greater than 1.9675476980854363 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (299) + (17) - 2, .975) and 0.16278084250438143 = (11.909982581254772 - 9.971265582465612) / 11.909982581254772 is greater than 0.05. IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so. ```### Baseline Jit Disasm ```assembly ; System.Tests.Perf_Int64.TryFormat(Int64) push ebp mov ebp,esp push edi push esi push ebx sub esp,20 xor eax,eax mov [ebp-10],eax mov [ebp-14],eax mov eax,[ecx+4] test eax,eax je near ptr M00_L12 lea esi,[eax+8] mov edi,[eax+4] M00_L00: mov ebx,[ebp+8] mov eax,[ebp+0C] mov [ebp-1C],eax test eax,eax jge near ptr M00_L10 call dword ptr ds:[0A873288] mov eax,[eax+14] mov [ebp-28],eax mov [ebp-2C],esi mov [ebp-18],edi mov ecx,ebx neg ecx mov ebx,[ebp-1C] adc ebx,0 mov edx,ebx neg edx mov [ebp-20],ecx mov [ebp-24],edx mov ebx,ecx mov edi,edx mov ecx,6BA5261C mov edx,ebx or edx,1 mov esi,edi or esi,0 jne short M00_L01 or edx,1 lzcnt edx,edx xor edx,1F jmp short M00_L02 M00_L01: or esi,1 xor edx,edx lzcnt edx,esi xor edx,1F add edx,20 M00_L02: movzx ecx,byte ptr [ecx+edx] lea edx,[ecx*8+6BA5872C] mov esi,[edx] mov edx,[edx+4] cmp ebx,esi sbb edi,edx setb dl movzx edx,dl sub ecx,edx cmp ecx,1 jg short M00_L04 mov ecx,1 M00_L03: add ecx,[eax+4] cmp ecx,[ebp-18] jle short M00_L05 xor ecx,ecx mov [ebp-10],ecx xor eax,eax jmp short M00_L09 M00_L04: jmp short M00_L03 M00_L05: mov [ebp-10],ecx mov esi,[ebp-2C] mov [ebp-14],esi lea ecx,[esi+ecx*2] push dword ptr [ebp-24] push dword ptr [ebp-20] mov edx,1 call dword ptr ds:[882B9C0] mov esi,[ebp-28] mov ecx,[esi+4] dec ecx js short M00_L08 cmp [esi+4],ecx jle short M00_L07 M00_L06: add eax,0FFFFFFFE movzx edx,word ptr [esi+ecx*2+8] mov [eax],dx dec ecx jns short M00_L06 jmp short M00_L08 M00_L07: add eax,0FFFFFFFE cmp ecx,[esi+4] jae short M00_L13 movzx edx,word ptr [esi+ecx*2+8] mov [eax],dx dec ecx jns short M00_L07 M00_L08: xor ecx,ecx mov [ebp-14],ecx mov eax,1 M00_L09: xor ecx,ecx mov [ebp-14],ecx jmp short M00_L11 M00_L10: push dword ptr [ebp-1C] push ebx push edi push esi lea ecx,[ebp-10] call dword ptr ds:[882BA08]; System.Number.TryUInt64ToDecStr(UInt64, System.Span`1, Int32 ByRef) M00_L11: lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret 8 M00_L12: xor esi,esi xor edi,edi jmp near ptr M00_L00 M00_L13: call CORINFO_HELP_RNGCHKFAIL int 3 ; Total bytes of code 329 ``` ```assembly ; System.Number.TryUInt64ToDecStr(UInt64, System.Span`1, Int32 ByRef) push ebp mov ebp,esp push esi push eax xor eax,eax mov [ebp-8],eax mov eax,6BA5261C mov edx,[ebp+10] mov esi,[ebp+14] or edx,1 or esi,0 jne short M01_L00 or edx,1 lzcnt edx,edx xor edx,1F jmp short M01_L01 M01_L00: or esi,1 xor edx,edx lzcnt edx,esi xor edx,1F add edx,20 M01_L01: movzx eax,byte ptr [eax+edx] lea edx,[eax*8+6BA5872C] mov esi,[edx] mov edx,[edx+4] cmp [ebp+10],esi mov esi,[ebp+14] sbb esi,edx setb dl movzx edx,dl sub eax,edx cmp eax,[ebp+0C] jg short M01_L02 mov [ecx],eax mov ecx,[ebp+8] mov [ebp-8],ecx lea ecx,[ecx+eax*2] push dword ptr [ebp+14] push dword ptr [ebp+10] call dword ptr ds:[882B9A8]; System.Number.UInt64ToDecChars(Char*, UInt64) xor eax,eax mov [ebp-8],eax mov eax,1 pop ecx pop esi pop ebp ret 10 M01_L02: xor eax,eax mov [ecx],eax pop ecx pop esi pop ebp ret 10 ; Total bytes of code 142 ``` ### Compare Jit Disasm ```assembly ; System.Tests.Perf_Int64.TryFormat(Int64) push ebp mov ebp,esp push edi push esi push ebx sub esp,2C xor eax,eax mov [ebp-10],eax mov [ebp-14],eax mov [ebp-18],eax mov eax,[ecx+4] test eax,eax je near ptr M00_L16 lea esi,[eax+8] mov edi,[eax+4] M00_L00: mov ebx,[ebp+8] mov eax,[ebp+0C] mov [ebp-24],eax test eax,eax jge near ptr M00_L10 call dword ptr ds:[0AC838B8] mov eax,[eax+14] mov [ebp-30],eax mov [ebp-34],esi mov [ebp-1C],edi mov ecx,ebx neg ecx mov ebx,[ebp-24] adc ebx,0 mov edx,ebx neg edx mov [ebp-28],ecx mov [ebp-2C],edx mov ebx,ecx mov edi,edx mov ecx,6AB4164C mov edx,ebx or edx,1 mov esi,edi or esi,0 jne short M00_L01 or edx,1 lzcnt edx,edx xor edx,1F jmp short M00_L02 M00_L01: or esi,1 xor edx,edx lzcnt edx,esi xor edx,1F add edx,20 M00_L02: movzx ecx,byte ptr [ecx+edx] lea edx,[ecx*8+6AB47FD8] mov esi,[edx] mov edx,[edx+4] cmp ebx,esi sbb edi,edx setb dl movzx edx,dl sub ecx,edx cmp ecx,1 jg short M00_L04 mov ecx,1 M00_L03: add ecx,[eax+4] cmp ecx,[ebp-1C] jle short M00_L05 xor ecx,ecx mov [ebp-10],ecx xor eax,eax jmp short M00_L09 M00_L04: jmp short M00_L03 M00_L05: mov [ebp-10],ecx mov esi,[ebp-34] mov [ebp-14],esi lea ecx,[esi+ecx*2] push dword ptr [ebp-2C] push dword ptr [ebp-28] mov edx,1 call dword ptr ds:[8C2B5D0] mov esi,[ebp-30] mov ecx,[esi+4] dec ecx js short M00_L08 cmp [esi+4],ecx jle short M00_L07 M00_L06: add eax,0FFFFFFFE movzx edx,word ptr [esi+ecx*2+8] mov [eax],dx dec ecx jns short M00_L06 jmp short M00_L08 M00_L07: add eax,0FFFFFFFE cmp ecx,[esi+4] jae near ptr M00_L17 movzx edx,word ptr [esi+ecx*2+8] mov [eax],dx dec ecx jns short M00_L07 M00_L08: xor ecx,ecx mov [ebp-14],ecx mov eax,1 M00_L09: xor ecx,ecx mov [ebp-14],ecx jmp near ptr M00_L15 M00_L10: mov [ebp-38],esi mov [ebp-20],edi mov esi,6AB4164C mov edi,ebx or edi,1 mov eax,[ebp-24] mov edx,eax or edx,0 jne short M00_L11 or edi,1 xor edx,edx lzcnt edx,edi xor edx,1F jmp short M00_L12 M00_L11: or edx,1 lzcnt edx,edx xor edx,1F add edx,20 M00_L12: movzx edx,byte ptr [esi+edx] lea esi,[edx*8+6AB47FD8] mov edi,[esi] mov esi,[esi+4] cmp ebx,edi mov edi,eax sbb edi,esi setb cl movzx ecx,cl sub edx,ecx cmp edx,[ebp-20] jg short M00_L13 mov [ebp-10],edx mov ecx,[ebp-38] mov [ebp-18],ecx lea ecx,[ecx+edx*2] push eax push ebx call dword ptr ds:[8C2B5B8]; System.Number.UInt64ToDecChars(Char*, UInt64) xor eax,eax mov [ebp-18],eax mov eax,1 jmp short M00_L14 M00_L13: xor eax,eax mov [ebp-10],eax M00_L14: xor edx,edx mov [ebp-18],edx M00_L15: lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret 8 M00_L16: xor esi,esi xor edi,edi jmp near ptr M00_L00 M00_L17: call CORINFO_HELP_RNGCHKFAIL int 3 ; Total bytes of code 454 ``` ```assembly ; System.Number.UInt64ToDecChars(Char*, UInt64) push ebp mov ebp,esp push edi push esi push ebx mov esi,ecx M01_L00: cmp dword ptr [ebp+0C],0 jne short M01_L08 mov ecx,[ebp+8] cmp ecx,0A jb short M01_L06 cmp ecx,64 jb short M01_L05 M01_L01: add esi,0FFFFFFFC mov edx,51EB851F mov eax,ecx mul edx shr edx,5 imul eax,edx,64 sub ecx,eax mov eax,85E1224 mov eax,[eax+ecx*4+8] mov [esi],eax cmp edx,64 jae short M01_L04 M01_L02: cmp edx,0A jb short M01_L03 add esi,0FFFFFFFC mov eax,85E1224 mov edx,[eax+edx*4+8] mov [esi],edx jmp short M01_L07 M01_L03: mov ecx,edx jmp short M01_L06 M01_L04: mov ecx,edx jmp short M01_L01 M01_L05: mov edx,ecx jmp short M01_L02 M01_L06: add esi,0FFFFFFFE lea eax,[ecx+30] mov [esi],ax M01_L07: mov eax,esi pop ebx pop esi pop edi pop ebp ret 8 M01_L08: mov eax,[ebp+8] mov edx,[ebp+0C] mov ecx,3B9ACA00 cmp edx,ecx jb short M01_L09 mov edi,eax mov eax,edx xor edx,edx div ecx mov eax,edi M01_L09: div ecx mov edi,edx push dword ptr [ebp+0C] push dword ptr [ebp+8] push 0 push 3B9ACA00 call CORINFO_HELP_ULDIV mov [ebp+8],eax mov [ebp+0C],edx mov ecx,esi mov esi,9 cmp edi,64 jb short M01_L11 M01_L10: add ecx,0FFFFFFFC add esi,0FFFFFFFE mov edx,51EB851F mov eax,edi mul edx shr edx,5 imul eax,edx,64 sub edi,eax mov eax,85E1224 mov eax,[eax+edi*4+8] mov [ecx],eax cmp edx,64 mov edi,edx jae short M01_L10 M01_L11: test edi,edi je short M01_L13 M01_L12: dec esi mov edx,0CCCCCCCD mov eax,edi mul edx shr edx,3 lea eax,[edx+edx*4] add eax,eax mov ebx,edi sub ebx,eax mov edi,edx add ecx,0FFFFFFFE add ebx,30 mov [ecx],bx test edi,edi jne short M01_L12 M01_L13: test esi,esi jg short M01_L12 mov esi,ecx jmp near ptr M01_L00 ; Total bytes of code 272 ``` ### Docs [Profiling workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/profiling-workflow-dotnet-runtime.md) [Benchmarking workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/benchmarking-workflow-dotnet-runtime.md)

Run Information

Architecture x86
OS Windows 10.0.18362
Baseline ff12237f483eb0afdabf1aeb71b69ff992d6bd40
Compare 7ec3634ee579d89b6024f72b595bfd7118093fc5
Diff Diff

Improvements in System.Tests.Perf_Int32

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
[TryFormat - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Tests.Perf_Int32.TryFormat(value%3a%2012345).html>) 6.93 ns 5.84 ns 0.84 0.03 False 90.43275616938072 80.554272547679 0.8907643199196617 Trace Trace
[TryFormat - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Tests.Perf_Int32.TryFormat(value%3a%202147483647).html>) 9.39 ns 8.32 ns 0.89 0.04 False 119.28234036998586 109.72455368684238 0.919872575827256 Trace Trace
[TryFormat - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Tests.Perf_Int32.TryFormat(value%3a%204).html>) 5.18 ns 2.88 ns 0.56 0.07 False 58.3119154044067 48.71459747707323 0.8354141197253796 Trace Trace

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_Int32*'
### Payloads [Baseline]() [Compare]() ### Histogram #### System.Tests.Perf_Int32.TryFormat(value: 12345) ```log ``` ### Description of detection logic ```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. 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 5.835231091117202 < 6.580677359003693. IsChangePoint: Marked as a change because one of 1/21/2023 1:51:00 AM, 1/24/2023 6:33:57 AM falls between 1/15/2023 4:08:29 PM and 1/24/2023 6:33:57 AM. IsImprovementStdDev: Marked as improvement because 38.569230425549264 (T) = (0 -5.699327855700928) / Math.Sqrt((0.009301384067737714 / (299)) + (0.016982623653698462 / (17))) is greater than 1.9675476980854363 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (299) + (17) - 2, .975) and 0.17844039920798263 = (6.937205590691827 - 5.699327855700928) / 6.937205590691827 is greater than 0.05. IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so. ```### Baseline Jit Disasm ```assembly ; System.Tests.Perf_Int32.TryFormat(Int32) push ebp mov ebp,esp push edi push esi push ebx sub esp,18 xor eax,eax mov [ebp-10],eax mov [ebp-14],eax mov eax,[ecx+4] test eax,eax je near ptr M00_L17 lea esi,[eax+8] mov edi,[eax+4] M00_L00: mov ebx,edx test ebx,ebx jge near ptr M00_L15 call dword ptr ds:[0B1B3288] mov ecx,[eax+14] mov [ebp-20],edi mov eax,ebx neg eax mov edx,eax or edx,1 lzcnt edx,edx xor edx,1F lea edx,[edx*8+6AFB7C34] mov edi,[edx] mov edx,[edx+4] add edi,eax adc edx,0 cmp edx,1 jg near ptr M00_L14 mov edx,1 M00_L01: mov edi,[ecx+4] mov [ebp-24],edi add edx,edi cmp edx,[ebp-20] jg near ptr M00_L18 mov [ebp-10],edx mov [ebp-14],esi lea esi,[esi+edx*2] neg ebx mov eax,1 cmp ebx,64 jb near ptr M00_L13 M00_L02: add esi,0FFFFFFFC add eax,0FFFFFFFE mov [ebp-1C],eax mov edx,51EB851F mov eax,ebx mul edx shr edx,5 imul eax,edx,64 sub ebx,eax mov eax,8AB12C0 mov eax,[eax+ebx*4+8] mov [esi],eax cmp edx,64 jae short M00_L12 M00_L03: test edx,edx je short M00_L11 M00_L04: mov ebx,[ebp-1C] dec ebx mov eax,0CCCCCCCD mov [ebp-18],edx mul edx shr edx,3 lea eax,[edx+edx*4] add eax,eax mov edi,[ebp-18] sub edi,eax add esi,0FFFFFFFE add edi,30 mov [esi],di test edx,edx jne short M00_L10 M00_L05: test ebx,ebx mov [ebp-1C],ebx jg short M00_L04 mov edx,esi mov edi,[ebp-24] lea eax,[edi-1] test eax,eax jl short M00_L07 cmp edi,eax jle short M00_L16 M00_L06: add edx,0FFFFFFFE movzx edi,word ptr [ecx+eax*2+8] mov [edx],di dec eax jns short M00_L06 M00_L07: xor edx,edx mov [ebp-14],edx mov edx,1 M00_L08: xor ecx,ecx mov [ebp-14],ecx mov eax,edx M00_L09: lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret M00_L10: mov [ebp-1C],ebx jmp short M00_L04 M00_L11: mov ebx,[ebp-1C] jmp short M00_L05 M00_L12: mov ebx,edx mov eax,[ebp-1C] jmp near ptr M00_L02 M00_L13: mov [ebp-1C],eax mov edx,ebx jmp near ptr M00_L03 M00_L14: jmp near ptr M00_L01 M00_L15: push edi push esi lea edx,[ebp-10] mov ecx,ebx call dword ptr ds:[90FB888]; System.Number.TryUInt32ToDecStr(UInt32, System.Span`1, Int32 ByRef) jmp short M00_L09 M00_L16: add edx,0FFFFFFFE cmp eax,edi jae short M00_L19 movzx esi,word ptr [ecx+eax*2+8] mov [edx],si dec eax jns short M00_L16 jmp short M00_L07 M00_L17: xor esi,esi xor edi,edi jmp near ptr M00_L00 M00_L18: xor eax,eax mov [ebp-10],eax mov edx,eax jmp short M00_L08 M00_L19: call CORINFO_HELP_RNGCHKFAIL int 3 ; Total bytes of code 387 ``` ```assembly ; System.Number.TryUInt32ToDecStr(UInt32, System.Span`1, Int32 ByRef) push ebp mov ebp,esp push esi push eax xor eax,eax mov [ebp-8],eax mov eax,ecx or eax,1 lzcnt eax,eax xor eax,1F lea eax,[eax*8+6AFB7C34] mov esi,[eax] mov eax,[eax+4] add esi,ecx adc eax,0 cmp eax,[ebp+0C] jg short M01_L07 mov [edx],eax mov edx,[ebp+8] mov [ebp-8],edx lea esi,[edx+eax*2] cmp ecx,0A jb short M01_L05 cmp ecx,64 jb short M01_L04 M01_L00: add esi,0FFFFFFFC mov edx,51EB851F mov eax,ecx mul edx shr edx,5 imul eax,edx,64 sub ecx,eax mov eax,8AB12C0 mov eax,[eax+ecx*4+8] mov [esi],eax cmp edx,64 jae short M01_L03 M01_L01: cmp edx,0A jb short M01_L02 add esi,0FFFFFFFC mov eax,8AB12C0 mov edx,[eax+edx*4+8] mov [esi],edx jmp short M01_L06 M01_L02: mov ecx,edx jmp short M01_L05 M01_L03: mov ecx,edx jmp short M01_L00 M01_L04: mov edx,ecx jmp short M01_L01 M01_L05: lea eax,[ecx+30] mov [esi-2],ax M01_L06: xor eax,eax mov [ebp-8],eax mov eax,1 pop ecx pop esi pop ebp ret 8 M01_L07: xor eax,eax mov [edx],eax pop ecx pop esi pop ebp ret 8 ; Total bytes of code 167 ``` ### Compare Jit Disasm ```assembly ; System.Tests.Perf_Int32.TryFormat(Int32) push ebp mov ebp,esp push edi push esi push ebx sub esp,1C xor eax,eax mov [ebp-10],eax mov [ebp-14],eax mov [ebp-20],eax mov eax,[ecx+4] test eax,eax je near ptr M00_L27 lea esi,[eax+8] mov edi,[eax+4] M00_L00: mov ebx,edx test ebx,ebx jge near ptr M00_L15 call dword ptr ds:[0A6F38B8] mov ecx,[eax+14] mov [ebp-24],edi mov eax,ebx neg eax mov edx,eax or edx,1 lzcnt edx,edx xor edx,1F lea edx,[edx*8+6AE06D50] mov edi,[edx] mov edx,[edx+4] add edi,eax adc edx,0 cmp edx,1 jg near ptr M00_L14 mov edx,1 M00_L01: mov edi,[ecx+4] mov [ebp-28],edi add edx,edi cmp edx,[ebp-24] jg near ptr M00_L28 mov [ebp-10],edx mov [ebp-14],esi lea esi,[esi+edx*2] neg ebx mov eax,1 cmp ebx,64 jb near ptr M00_L13 M00_L02: add esi,0FFFFFFFC add eax,0FFFFFFFE mov [ebp-1C],eax mov edx,51EB851F mov eax,ebx mul edx shr edx,5 imul eax,edx,64 sub ebx,eax mov eax,8051224 mov eax,[eax+ebx*4+8] mov [esi],eax cmp edx,64 jae short M00_L12 M00_L03: test edx,edx je short M00_L11 M00_L04: mov ebx,[ebp-1C] dec ebx mov eax,0CCCCCCCD mov [ebp-18],edx mul edx shr edx,3 lea eax,[edx+edx*4] add eax,eax mov edi,[ebp-18] sub edi,eax add esi,0FFFFFFFE add edi,30 mov [esi],di test edx,edx jne short M00_L10 M00_L05: test ebx,ebx mov [ebp-1C],ebx jg short M00_L04 mov eax,esi mov edi,[ebp-28] lea edx,[edi-1] test edx,edx jl short M00_L07 cmp edi,edx jle short M00_L16 M00_L06: add eax,0FFFFFFFE movzx edi,word ptr [ecx+edx*2+8] mov [eax],di dec edx jns short M00_L06 M00_L07: xor eax,eax mov [ebp-14],eax mov eax,1 M00_L08: xor edx,edx mov [ebp-14],edx M00_L09: lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret M00_L10: mov [ebp-1C],ebx jmp short M00_L04 M00_L11: mov ebx,[ebp-1C] jmp short M00_L05 M00_L12: mov ebx,edx mov eax,[ebp-1C] jmp near ptr M00_L02 M00_L13: mov [ebp-1C],eax mov edx,ebx jmp near ptr M00_L03 M00_L14: jmp near ptr M00_L01 M00_L15: mov edx,esi mov eax,ebx or eax,1 lzcnt eax,eax xor eax,1F lea eax,[eax*8+6AE06D50] mov ecx,[eax] mov eax,[eax+4] add ecx,ebx adc eax,0 cmp eax,edi jg near ptr M00_L25 jmp short M00_L17 M00_L16: add eax,0FFFFFFFE cmp edx,edi jae near ptr M00_L29 movzx esi,word ptr [ecx+edx*2+8] mov [eax],si dec edx jns short M00_L16 jmp short M00_L07 M00_L17: mov [ebp-10],eax mov [ebp-20],edx lea ecx,[edx+eax*2] cmp ebx,0A jb short M00_L23 cmp ebx,64 jb short M00_L22 M00_L18: add ecx,0FFFFFFFC mov edx,51EB851F mov eax,ebx mul edx shr edx,5 imul eax,edx,64 sub ebx,eax mov eax,8051224 mov eax,[eax+ebx*4+8] mov [ecx],eax cmp edx,64 jae short M00_L21 M00_L19: cmp edx,0A jb short M00_L20 add ecx,0FFFFFFFC mov eax,8051224 mov edx,[eax+edx*4+8] mov [ecx],edx jmp short M00_L24 M00_L20: mov ebx,edx jmp short M00_L23 M00_L21: mov ebx,edx jmp short M00_L18 M00_L22: mov edx,ebx jmp short M00_L19 M00_L23: lea eax,[ebx+30] mov [ecx-2],ax M00_L24: xor eax,eax mov [ebp-20],eax mov eax,1 jmp short M00_L26 M00_L25: xor eax,eax mov [ebp-10],eax M00_L26: xor edx,edx mov [ebp-20],edx jmp near ptr M00_L09 M00_L27: xor esi,esi xor edi,edi jmp near ptr M00_L00 M00_L28: xor eax,eax mov [ebp-10],eax jmp near ptr M00_L08 M00_L29: call CORINFO_HELP_RNGCHKFAIL int 3 ; Total bytes of code 541 ``` #### System.Tests.Perf_Int32.TryFormat(value: 2147483647) ```log ``` ### Description of detection logic ```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. 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 8.323037029160854 < 8.923782892741992. IsChangePoint: Marked as a change because one of 1/21/2023 1:51:00 AM, 1/24/2023 6:33:57 AM falls between 1/15/2023 4:08:29 PM and 1/24/2023 6:33:57 AM. IsImprovementStdDev: Marked as improvement because 34.315253708164484 (T) = (0 -8.165898242991032) / Math.Sqrt((0.027080978096184594 / (299)) + (0.022966018860682207 / (17))) is greater than 1.9675476980854363 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (299) + (17) - 2, .975) and 0.13759535898209244 = (9.46875498414841 - 8.165898242991032) / 9.46875498414841 is greater than 0.05. IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so. ```### Baseline Jit Disasm ```assembly ; System.Tests.Perf_Int32.TryFormat(Int32) push ebp mov ebp,esp push edi push esi push ebx sub esp,18 xor eax,eax mov [ebp-10],eax mov [ebp-14],eax mov eax,[ecx+4] test eax,eax je near ptr M00_L17 lea esi,[eax+8] mov edi,[eax+4] M00_L00: mov ebx,edx test ebx,ebx jge near ptr M00_L15 call dword ptr ds:[0AE13288] mov ecx,[eax+14] mov [ebp-20],edi mov eax,ebx neg eax mov edx,eax or edx,1 lzcnt edx,edx xor edx,1F lea edx,[edx*8+6AFB7C34] mov edi,[edx] mov edx,[edx+4] add edi,eax adc edx,0 cmp edx,1 jg near ptr M00_L14 mov edx,1 M00_L01: mov edi,[ecx+4] mov [ebp-24],edi add edx,edi cmp edx,[ebp-20] jg near ptr M00_L18 mov [ebp-10],edx mov [ebp-14],esi lea esi,[esi+edx*2] neg ebx mov eax,1 cmp ebx,64 jb near ptr M00_L13 M00_L02: add esi,0FFFFFFFC add eax,0FFFFFFFE mov [ebp-1C],eax mov edx,51EB851F mov eax,ebx mul edx shr edx,5 imul eax,edx,64 sub ebx,eax mov eax,87112C0 mov eax,[eax+ebx*4+8] mov [esi],eax cmp edx,64 jae short M00_L12 M00_L03: test edx,edx je short M00_L11 M00_L04: mov ebx,[ebp-1C] dec ebx mov eax,0CCCCCCCD mov [ebp-18],edx mul edx shr edx,3 lea eax,[edx+edx*4] add eax,eax mov edi,[ebp-18] sub edi,eax add esi,0FFFFFFFE add edi,30 mov [esi],di test edx,edx jne short M00_L10 M00_L05: test ebx,ebx mov [ebp-1C],ebx jg short M00_L04 mov edx,esi mov edi,[ebp-24] lea eax,[edi-1] test eax,eax jl short M00_L07 cmp edi,eax jle short M00_L16 M00_L06: add edx,0FFFFFFFE movzx edi,word ptr [ecx+eax*2+8] mov [edx],di dec eax jns short M00_L06 M00_L07: xor edx,edx mov [ebp-14],edx mov edx,1 M00_L08: xor ecx,ecx mov [ebp-14],ecx mov eax,edx M00_L09: lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret M00_L10: mov [ebp-1C],ebx jmp short M00_L04 M00_L11: mov ebx,[ebp-1C] jmp short M00_L05 M00_L12: mov ebx,edx mov eax,[ebp-1C] jmp near ptr M00_L02 M00_L13: mov [ebp-1C],eax mov edx,ebx jmp near ptr M00_L03 M00_L14: jmp near ptr M00_L01 M00_L15: push edi push esi lea edx,[ebp-10] mov ecx,ebx call dword ptr ds:[8D5B888]; System.Number.TryUInt32ToDecStr(UInt32, System.Span`1, Int32 ByRef) jmp short M00_L09 M00_L16: add edx,0FFFFFFFE cmp eax,edi jae short M00_L19 movzx esi,word ptr [ecx+eax*2+8] mov [edx],si dec eax jns short M00_L16 jmp short M00_L07 M00_L17: xor esi,esi xor edi,edi jmp near ptr M00_L00 M00_L18: xor eax,eax mov [ebp-10],eax mov edx,eax jmp short M00_L08 M00_L19: call CORINFO_HELP_RNGCHKFAIL int 3 ; Total bytes of code 387 ``` ```assembly ; System.Number.TryUInt32ToDecStr(UInt32, System.Span`1, Int32 ByRef) push ebp mov ebp,esp push esi push eax xor eax,eax mov [ebp-8],eax mov eax,ecx or eax,1 lzcnt eax,eax xor eax,1F lea eax,[eax*8+6AFB7C34] mov esi,[eax] mov eax,[eax+4] add esi,ecx adc eax,0 cmp eax,[ebp+0C] jg short M01_L07 mov [edx],eax mov edx,[ebp+8] mov [ebp-8],edx lea esi,[edx+eax*2] cmp ecx,0A jb short M01_L05 cmp ecx,64 jb short M01_L04 M01_L00: add esi,0FFFFFFFC mov edx,51EB851F mov eax,ecx mul edx shr edx,5 imul eax,edx,64 sub ecx,eax mov eax,87112C0 mov eax,[eax+ecx*4+8] mov [esi],eax cmp edx,64 jae short M01_L03 M01_L01: cmp edx,0A jb short M01_L02 add esi,0FFFFFFFC mov eax,87112C0 mov edx,[eax+edx*4+8] mov [esi],edx jmp short M01_L06 M01_L02: mov ecx,edx jmp short M01_L05 M01_L03: mov ecx,edx jmp short M01_L00 M01_L04: mov edx,ecx jmp short M01_L01 M01_L05: lea eax,[ecx+30] mov [esi-2],ax M01_L06: xor eax,eax mov [ebp-8],eax mov eax,1 pop ecx pop esi pop ebp ret 8 M01_L07: xor eax,eax mov [edx],eax pop ecx pop esi pop ebp ret 8 ; Total bytes of code 167 ``` ### Compare Jit Disasm ```assembly ; System.Tests.Perf_Int32.TryFormat(Int32) push ebp mov ebp,esp push edi push esi push ebx sub esp,1C xor eax,eax mov [ebp-10],eax mov [ebp-14],eax mov [ebp-20],eax mov eax,[ecx+4] test eax,eax je near ptr M00_L27 lea esi,[eax+8] mov edi,[eax+4] M00_L00: mov ebx,edx test ebx,ebx jge near ptr M00_L15 call dword ptr ds:[0A9D38B8] mov ecx,[eax+14] mov [ebp-24],edi mov eax,ebx neg eax mov edx,eax or edx,1 lzcnt edx,edx xor edx,1F lea edx,[edx*8+6AE06D50] mov edi,[edx] mov edx,[edx+4] add edi,eax adc edx,0 cmp edx,1 jg near ptr M00_L14 mov edx,1 M00_L01: mov edi,[ecx+4] mov [ebp-28],edi add edx,edi cmp edx,[ebp-24] jg near ptr M00_L28 mov [ebp-10],edx mov [ebp-14],esi lea esi,[esi+edx*2] neg ebx mov eax,1 cmp ebx,64 jb near ptr M00_L13 M00_L02: add esi,0FFFFFFFC add eax,0FFFFFFFE mov [ebp-1C],eax mov edx,51EB851F mov eax,ebx mul edx shr edx,5 imul eax,edx,64 sub ebx,eax mov eax,8331224 mov eax,[eax+ebx*4+8] mov [esi],eax cmp edx,64 jae short M00_L12 M00_L03: test edx,edx je short M00_L11 M00_L04: mov ebx,[ebp-1C] dec ebx mov eax,0CCCCCCCD mov [ebp-18],edx mul edx shr edx,3 lea eax,[edx+edx*4] add eax,eax mov edi,[ebp-18] sub edi,eax add esi,0FFFFFFFE add edi,30 mov [esi],di test edx,edx jne short M00_L10 M00_L05: test ebx,ebx mov [ebp-1C],ebx jg short M00_L04 mov eax,esi mov edi,[ebp-28] lea edx,[edi-1] test edx,edx jl short M00_L07 cmp edi,edx jle short M00_L16 M00_L06: add eax,0FFFFFFFE movzx edi,word ptr [ecx+edx*2+8] mov [eax],di dec edx jns short M00_L06 M00_L07: xor eax,eax mov [ebp-14],eax mov eax,1 M00_L08: xor edx,edx mov [ebp-14],edx M00_L09: lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret M00_L10: mov [ebp-1C],ebx jmp short M00_L04 M00_L11: mov ebx,[ebp-1C] jmp short M00_L05 M00_L12: mov ebx,edx mov eax,[ebp-1C] jmp near ptr M00_L02 M00_L13: mov [ebp-1C],eax mov edx,ebx jmp near ptr M00_L03 M00_L14: jmp near ptr M00_L01 M00_L15: mov edx,esi mov eax,ebx or eax,1 lzcnt eax,eax xor eax,1F lea eax,[eax*8+6AE06D50] mov ecx,[eax] mov eax,[eax+4] add ecx,ebx adc eax,0 cmp eax,edi jg near ptr M00_L25 jmp short M00_L17 M00_L16: add eax,0FFFFFFFE cmp edx,edi jae near ptr M00_L29 movzx esi,word ptr [ecx+edx*2+8] mov [eax],si dec edx jns short M00_L16 jmp short M00_L07 M00_L17: mov [ebp-10],eax mov [ebp-20],edx lea ecx,[edx+eax*2] cmp ebx,0A jb short M00_L23 cmp ebx,64 jb short M00_L22 M00_L18: add ecx,0FFFFFFFC mov edx,51EB851F mov eax,ebx mul edx shr edx,5 imul eax,edx,64 sub ebx,eax mov eax,8331224 mov eax,[eax+ebx*4+8] mov [ecx],eax cmp edx,64 jae short M00_L21 M00_L19: cmp edx,0A jb short M00_L20 add ecx,0FFFFFFFC mov eax,8331224 mov edx,[eax+edx*4+8] mov [ecx],edx jmp short M00_L24 M00_L20: mov ebx,edx jmp short M00_L23 M00_L21: mov ebx,edx jmp short M00_L18 M00_L22: mov edx,ebx jmp short M00_L19 M00_L23: lea eax,[ebx+30] mov [ecx-2],ax M00_L24: xor eax,eax mov [ebp-20],eax mov eax,1 jmp short M00_L26 M00_L25: xor eax,eax mov [ebp-10],eax M00_L26: xor edx,edx mov [ebp-20],edx jmp near ptr M00_L09 M00_L27: xor esi,esi xor edi,edi jmp near ptr M00_L00 M00_L28: xor eax,eax mov [ebp-10],eax jmp near ptr M00_L08 M00_L29: call CORINFO_HELP_RNGCHKFAIL int 3 ; Total bytes of code 541 ``` #### System.Tests.Perf_Int32.TryFormat(value: 4) ```log ``` ### Description of detection logic ```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. 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 2.883850429167533 < 4.90225764032258. IsChangePoint: Marked as a change because one of 1/21/2023 1:51:00 AM, 1/24/2023 6:33:57 AM falls between 1/15/2023 4:08:29 PM and 1/24/2023 6:33:57 AM. IsImprovementStdDev: Marked as improvement because 127.19588919816721 (T) = (0 -2.8445014440425678) / Math.Sqrt((0.009481088492353122 / (299)) + (0.0053147332854796584 / (17))) is greater than 1.9675476980854363 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (299) + (17) - 2, .975) and 0.4534851446402431 = (5.204801692298198 - 2.8445014440425678) / 5.204801692298198 is greater than 0.05. IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so. ```### Baseline Jit Disasm ```assembly ; System.Tests.Perf_Int32.TryFormat(Int32) push ebp mov ebp,esp push edi push esi push ebx sub esp,18 xor eax,eax mov [ebp-10],eax mov [ebp-14],eax mov eax,[ecx+4] test eax,eax je near ptr M00_L17 lea esi,[eax+8] mov edi,[eax+4] M00_L00: mov ebx,edx test ebx,ebx jge near ptr M00_L15 call dword ptr ds:[0AB23288] mov ecx,[eax+14] mov [ebp-20],edi mov eax,ebx neg eax mov edx,eax or edx,1 lzcnt edx,edx xor edx,1F lea edx,[edx*8+6AFB7C34] mov edi,[edx] mov edx,[edx+4] add edi,eax adc edx,0 cmp edx,1 jg near ptr M00_L14 mov edx,1 M00_L01: mov edi,[ecx+4] mov [ebp-24],edi add edx,edi cmp edx,[ebp-20] jg near ptr M00_L18 mov [ebp-10],edx mov [ebp-14],esi lea esi,[esi+edx*2] neg ebx mov eax,1 cmp ebx,64 jb near ptr M00_L13 M00_L02: add esi,0FFFFFFFC add eax,0FFFFFFFE mov [ebp-1C],eax mov edx,51EB851F mov eax,ebx mul edx shr edx,5 imul eax,edx,64 sub ebx,eax mov eax,84212C0 mov eax,[eax+ebx*4+8] mov [esi],eax cmp edx,64 jae short M00_L12 M00_L03: test edx,edx je short M00_L11 M00_L04: mov ebx,[ebp-1C] dec ebx mov eax,0CCCCCCCD mov [ebp-18],edx mul edx shr edx,3 lea eax,[edx+edx*4] add eax,eax mov edi,[ebp-18] sub edi,eax add esi,0FFFFFFFE add edi,30 mov [esi],di test edx,edx jne short M00_L10 M00_L05: test ebx,ebx mov [ebp-1C],ebx jg short M00_L04 mov edx,esi mov edi,[ebp-24] lea eax,[edi-1] test eax,eax jl short M00_L07 cmp edi,eax jle short M00_L16 M00_L06: add edx,0FFFFFFFE movzx edi,word ptr [ecx+eax*2+8] mov [edx],di dec eax jns short M00_L06 M00_L07: xor edx,edx mov [ebp-14],edx mov edx,1 M00_L08: xor ecx,ecx mov [ebp-14],ecx mov eax,edx M00_L09: lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret M00_L10: mov [ebp-1C],ebx jmp short M00_L04 M00_L11: mov ebx,[ebp-1C] jmp short M00_L05 M00_L12: mov ebx,edx mov eax,[ebp-1C] jmp near ptr M00_L02 M00_L13: mov [ebp-1C],eax mov edx,ebx jmp near ptr M00_L03 M00_L14: jmp near ptr M00_L01 M00_L15: push edi push esi lea edx,[ebp-10] mov ecx,ebx call dword ptr ds:[8A6B888]; System.Number.TryUInt32ToDecStr(UInt32, System.Span`1, Int32 ByRef) jmp short M00_L09 M00_L16: add edx,0FFFFFFFE cmp eax,edi jae short M00_L19 movzx esi,word ptr [ecx+eax*2+8] mov [edx],si dec eax jns short M00_L16 jmp short M00_L07 M00_L17: xor esi,esi xor edi,edi jmp near ptr M00_L00 M00_L18: xor eax,eax mov [ebp-10],eax mov edx,eax jmp short M00_L08 M00_L19: call CORINFO_HELP_RNGCHKFAIL int 3 ; Total bytes of code 387 ``` ```assembly ; System.Number.TryUInt32ToDecStr(UInt32, System.Span`1, Int32 ByRef) push ebp mov ebp,esp push esi push eax xor eax,eax mov [ebp-8],eax mov eax,ecx or eax,1 lzcnt eax,eax xor eax,1F lea eax,[eax*8+6AFB7C34] mov esi,[eax] mov eax,[eax+4] add esi,ecx adc eax,0 cmp eax,[ebp+0C] jg short M01_L07 mov [edx],eax mov edx,[ebp+8] mov [ebp-8],edx lea esi,[edx+eax*2] cmp ecx,0A jb short M01_L05 cmp ecx,64 jb short M01_L04 M01_L00: add esi,0FFFFFFFC mov edx,51EB851F mov eax,ecx mul edx shr edx,5 imul eax,edx,64 sub ecx,eax mov eax,84212C0 mov eax,[eax+ecx*4+8] mov [esi],eax cmp edx,64 jae short M01_L03 M01_L01: cmp edx,0A jb short M01_L02 add esi,0FFFFFFFC mov eax,84212C0 mov edx,[eax+edx*4+8] mov [esi],edx jmp short M01_L06 M01_L02: mov ecx,edx jmp short M01_L05 M01_L03: mov ecx,edx jmp short M01_L00 M01_L04: mov edx,ecx jmp short M01_L01 M01_L05: lea eax,[ecx+30] mov [esi-2],ax M01_L06: xor eax,eax mov [ebp-8],eax mov eax,1 pop ecx pop esi pop ebp ret 8 M01_L07: xor eax,eax mov [edx],eax pop ecx pop esi pop ebp ret 8 ; Total bytes of code 167 ``` ### Compare Jit Disasm ```assembly ; System.Tests.Perf_Int32.TryFormat(Int32) push ebp mov ebp,esp push edi push esi push ebx sub esp,1C xor eax,eax mov [ebp-10],eax mov [ebp-14],eax mov [ebp-20],eax mov eax,[ecx+4] test eax,eax je near ptr M00_L27 lea esi,[eax+8] mov edi,[eax+4] M00_L00: mov ebx,edx test ebx,ebx jge near ptr M00_L15 call dword ptr ds:[0AB138B8] mov ecx,[eax+14] mov [ebp-24],edi mov eax,ebx neg eax mov edx,eax or edx,1 lzcnt edx,edx xor edx,1F lea edx,[edx*8+6AE06D50] mov edi,[edx] mov edx,[edx+4] add edi,eax adc edx,0 cmp edx,1 jg near ptr M00_L14 mov edx,1 M00_L01: mov edi,[ecx+4] mov [ebp-28],edi add edx,edi cmp edx,[ebp-24] jg near ptr M00_L28 mov [ebp-10],edx mov [ebp-14],esi lea esi,[esi+edx*2] neg ebx mov eax,1 cmp ebx,64 jb near ptr M00_L13 M00_L02: add esi,0FFFFFFFC add eax,0FFFFFFFE mov [ebp-1C],eax mov edx,51EB851F mov eax,ebx mul edx shr edx,5 imul eax,edx,64 sub ebx,eax mov eax,8471224 mov eax,[eax+ebx*4+8] mov [esi],eax cmp edx,64 jae short M00_L12 M00_L03: test edx,edx je short M00_L11 M00_L04: mov ebx,[ebp-1C] dec ebx mov eax,0CCCCCCCD mov [ebp-18],edx mul edx shr edx,3 lea eax,[edx+edx*4] add eax,eax mov edi,[ebp-18] sub edi,eax add esi,0FFFFFFFE add edi,30 mov [esi],di test edx,edx jne short M00_L10 M00_L05: test ebx,ebx mov [ebp-1C],ebx jg short M00_L04 mov eax,esi mov edi,[ebp-28] lea edx,[edi-1] test edx,edx jl short M00_L07 cmp edi,edx jle short M00_L16 M00_L06: add eax,0FFFFFFFE movzx edi,word ptr [ecx+edx*2+8] mov [eax],di dec edx jns short M00_L06 M00_L07: xor eax,eax mov [ebp-14],eax mov eax,1 M00_L08: xor edx,edx mov [ebp-14],edx M00_L09: lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret M00_L10: mov [ebp-1C],ebx jmp short M00_L04 M00_L11: mov ebx,[ebp-1C] jmp short M00_L05 M00_L12: mov ebx,edx mov eax,[ebp-1C] jmp near ptr M00_L02 M00_L13: mov [ebp-1C],eax mov edx,ebx jmp near ptr M00_L03 M00_L14: jmp near ptr M00_L01 M00_L15: mov edx,esi mov eax,ebx or eax,1 lzcnt eax,eax xor eax,1F lea eax,[eax*8+6AE06D50] mov ecx,[eax] mov eax,[eax+4] add ecx,ebx adc eax,0 cmp eax,edi jg near ptr M00_L25 jmp short M00_L17 M00_L16: add eax,0FFFFFFFE cmp edx,edi jae near ptr M00_L29 movzx esi,word ptr [ecx+edx*2+8] mov [eax],si dec edx jns short M00_L16 jmp short M00_L07 M00_L17: mov [ebp-10],eax mov [ebp-20],edx lea ecx,[edx+eax*2] cmp ebx,0A jb short M00_L23 cmp ebx,64 jb short M00_L22 M00_L18: add ecx,0FFFFFFFC mov edx,51EB851F mov eax,ebx mul edx shr edx,5 imul eax,edx,64 sub ebx,eax mov eax,8471224 mov eax,[eax+ebx*4+8] mov [ecx],eax cmp edx,64 jae short M00_L21 M00_L19: cmp edx,0A jb short M00_L20 add ecx,0FFFFFFFC mov eax,8471224 mov edx,[eax+edx*4+8] mov [ecx],edx jmp short M00_L24 M00_L20: mov ebx,edx jmp short M00_L23 M00_L21: mov ebx,edx jmp short M00_L18 M00_L22: mov edx,ebx jmp short M00_L19 M00_L23: lea eax,[ebx+30] mov [ecx-2],ax M00_L24: xor eax,eax mov [ebp-20],eax mov eax,1 jmp short M00_L26 M00_L25: xor eax,eax mov [ebp-10],eax M00_L26: xor edx,edx mov [ebp-20],edx jmp near ptr M00_L09 M00_L27: xor esi,esi xor edi,edi jmp near ptr M00_L00 M00_L28: xor eax,eax mov [ebp-10],eax jmp near ptr M00_L08 M00_L29: call CORINFO_HELP_RNGCHKFAIL int 3 ; Total bytes of code 541 ``` ### Docs [Profiling workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/profiling-workflow-dotnet-runtime.md) [Benchmarking workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/benchmarking-workflow-dotnet-runtime.md)