DrewScoggins / performance-2

This repo contains benchmarks used for testing the performance of all .NET Runtimes
MIT License
0 stars 0 forks source link

[Perf] Changes at 3/7/2021 7:54:19 PM #4473

Open performanceautofiler[bot] opened 3 years ago

performanceautofiler[bot] commented 3 years ago

Run Information

Architecture x86
OS Windows 10.0.18362
Baseline 6ce5878104d61cbdbfa6eb5db959bfc63e1e8596
Compare 027c093de1cc7d23a107e0594cebfb0216161dd4

Improvemnts in System.Tests.Perf_String

Benchmark Baseline Test Test/Base Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
[Interpolation_MultipleArgs](<https://pvscmdupload.blob.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Tests.Perf_String.Interpolation_MultipleArgs(c%3a%20%271%27%2c%20s%3a%20%22Foo%22).html>) 440.75 ns 411.56 ns 0.93 Trace Trace
[Split](<https://pvscmdupload.blob.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Tests.Perf_String.Split(s%3a%20%22A%20B%20C%20D%20E%20F%20G%20H%20I%20J%20K%20L%20M%20N%20O%20P%20Q%20R%20S%20T%20U%20V%20W%20X%20Y%20Z%22%2c%20arr%3a%20%5b%27%20%27%5d%2c%20options%3a%20RemoveEmptyEntries).html>) 585.73 ns 551.24 ns 0.94 Trace Trace
[IndexerCheckPathLength](<https://pvscmdupload.blob.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Tests.Perf_String.IndexerCheckPathLength.html>) 173.86 ns 144.24 ns 0.83 Trace Trace
[Concat_CharEnumerable](<https://pvscmdupload.blob.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Tests.Perf_String.Concat_CharEnumerable.html>) 8.20 μs 6.93 μs 0.85 Trace Trace
[Format_MultipleArgs](<https://pvscmdupload.blob.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Tests.Perf_String.Format_MultipleArgs.html>) 463.66 ns 410.26 ns 0.88 Trace Trace

graph graph graph graph graph Historical Data in Reporting System

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f netcoreapp5.0 --filter 'System.Tests.Perf_String*'
. ### Payloads [Baseline]() [Compare]() ### Histogram #### System.Tests.Perf_String.Interpolation_MultipleArgs(c: '1', s: "Foo") ```log [410.123 ; 423.630) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [423.630 ; 433.021) | @@@@@@@@@@@@@@ [433.021 ; 448.477) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [448.477 ; 464.602) | @@@@@@@@@@@@@@@@@@@@ ``` ### Baseline Jit Disasm ```assembly ; System.Tests.Perf_String.Interpolation_MultipleArgs(Char, System.String) push edi push esi push ebx mov edi,edx mov esi,[esp+10] mov ecx,offset MT_System.Object[] mov edx,8 call CORINFO_HELP_NEWARR_1_OBJ mov ebx,eax mov ecx,offset MT_System.Char call CORINFO_HELP_NEWSFAST mov [eax+4],di lea edx,[ebx+8] call CORINFO_HELP_ASSIGN_REF_EAX lea edx,[ebx+0C] call CORINFO_HELP_ASSIGN_REF_ESI lea edx,[ebx+10] call CORINFO_HELP_ASSIGN_REF_ESI lea edx,[ebx+14] call CORINFO_HELP_ASSIGN_REF_ESI lea edx,[ebx+18] call CORINFO_HELP_ASSIGN_REF_ESI lea edx,[ebx+1C] call CORINFO_HELP_ASSIGN_REF_ESI lea edx,[ebx+20] call CORINFO_HELP_ASSIGN_REF_ESI lea edx,[ebx+24] call CORINFO_HELP_ASSIGN_REF_ESI mov ecx,ds:[3B88] mov edx,ebx call System.String.Format(System.String, System.Object[]) pop ebx pop esi pop edi ret 4 ; Total bytes of code 123 ``` ```assembly ; System.String.Format(System.String, System.Object[]) push ebp mov ebp,esp push edi push esi sub esp,10 vzeroupper xor eax,eax mov [ebp+0FFE8],eax mov [ebp+0FFEC],eax mov [ebp+0FFF0],eax mov [ebp+0FFF4],eax mov esi,ecx test edx,edx je short M01_L00 lea ecx,[ebp+0FFE8] call System.ParamsArray..ctor(System.Object[]) push [ebp+0FFF4] push [ebp+0FFF0] push [ebp+0FFEC] push [ebp+0FFE8] mov edx,esi xor ecx,ecx call System.String.FormatHelper(System.IFormatProvider, System.String, System.ParamsArray) lea esp,[ebp+0FFF8] pop esi pop edi pop ebp ret M01_L00: test esi,esi je short M01_L01 mov esi,ds:[3B8C] jmp short M01_L02 M01_L01: mov esi,ds:[37C8] M01_L02: mov ecx,offset MT_System.ArgumentNullException call CORINFO_HELP_NEWSFAST mov edi,eax mov ecx,edi mov edx,esi call System.ArgumentNullException..ctor(System.String) mov ecx,edi call CORINFO_HELP_THROW int 3 ; Total bytes of code 114 ``` ### Compare Jit Disasm ```assembly ; System.Tests.Perf_String.Interpolation_MultipleArgs(Char, System.String) push edi push esi push ebx mov edi,edx mov esi,[esp+10] mov ecx,offset MT_System.Object[] mov edx,8 call CORINFO_HELP_NEWARR_1_OBJ mov ebx,eax mov ecx,offset MT_System.Char call CORINFO_HELP_NEWSFAST mov [eax+4],di lea edx,[ebx+8] call CORINFO_HELP_ASSIGN_REF_EAX lea edx,[ebx+0C] call CORINFO_HELP_ASSIGN_REF_ESI lea edx,[ebx+10] call CORINFO_HELP_ASSIGN_REF_ESI lea edx,[ebx+14] call CORINFO_HELP_ASSIGN_REF_ESI lea edx,[ebx+18] call CORINFO_HELP_ASSIGN_REF_ESI lea edx,[ebx+1C] call CORINFO_HELP_ASSIGN_REF_ESI lea edx,[ebx+20] call CORINFO_HELP_ASSIGN_REF_ESI lea edx,[ebx+24] call CORINFO_HELP_ASSIGN_REF_ESI mov ecx,ds:[3B94] mov edx,ebx call System.String.Format(System.String, System.Object[]) pop ebx pop esi pop edi ret 4 ; Total bytes of code 123 ``` ```assembly ; System.String.Format(System.String, System.Object[]) push ebp mov ebp,esp push edi push esi sub esp,10 vzeroupper xor eax,eax mov [ebp+0FFE8],eax mov [ebp+0FFEC],eax mov [ebp+0FFF0],eax mov [ebp+0FFF4],eax mov esi,ecx test edx,edx je short M01_L00 lea ecx,[ebp+0FFE8] call System.ParamsArray..ctor(System.Object[]) push [ebp+0FFF4] push [ebp+0FFF0] push [ebp+0FFEC] push [ebp+0FFE8] mov edx,esi xor ecx,ecx call System.String.FormatHelper(System.IFormatProvider, System.String, System.ParamsArray) lea esp,[ebp+0FFF8] pop esi pop edi pop ebp ret M01_L00: test esi,esi je short M01_L01 mov esi,ds:[3B98] jmp short M01_L02 M01_L01: mov esi,ds:[37D0] M01_L02: mov ecx,offset MT_System.ArgumentNullException call CORINFO_HELP_NEWSFAST mov edi,eax mov ecx,edi mov edx,esi call System.ArgumentNullException..ctor(System.String) mov ecx,edi call CORINFO_HELP_THROW int 3 ; Total bytes of code 114 ``` #### System.Tests.Perf_String.Split(s: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", arr: [' '], options: RemoveEmptyEntries) ```log [545.165 ; 565.619) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [565.619 ; 577.955) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [577.955 ; 594.720) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [594.720 ; 623.187) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ``` ### Baseline Jit Disasm ```assembly ; System.Tests.Perf_String.Split(System.String, Char[], System.StringSplitOptions) push ebp mov ebp,esp push esi mov ecx,[ebp+0C] cmp [edx],edx test ecx,ecx jne short M00_L00 xor eax,eax xor esi,esi jmp short M00_L01 M00_L00: lea eax,[ecx+8] mov esi,[ecx+4] M00_L01: push esi push eax mov ecx,[ebp+8] push ecx mov ecx,edx mov edx,7FFFFFFF call System.String.SplitInternal(System.ReadOnlySpan`1, Int32, System.StringSplitOptions) pop esi pop ebp ret 8 ; Total bytes of code 48 ``` ```assembly ; System.String.SplitInternal(System.ReadOnlySpan`1, Int32, System.StringSplitOptions) push ebp mov ebp,esp push edi push esi push ebx sub esp,1C vzeroupper xor eax,eax mov [ebp+0FFE0],eax mov [ebp+0FFE8],eax mov [ebp+0FFF0],esp mov dword ptr [ebp+0FFD8],3A78CFD3 mov edi,ecx mov esi,edx mov ebx,[ebp+8] test esi,esi jl near ptr M01_L12 test ebx,0FFFFFFFC jne near ptr M01_L13 cmp esi,1 jle short M01_L01 cmp dword ptr [edi+4],0 je short M01_L01 cmp dword ptr [ebp+10],0 ja short M01_L00 and ebx,0FFFFFFFD M01_L00: test [esp],esp mov edx,esp sub edx,200 mov esp,edx lea edx,[esp] mov [ebp+0FFF0],esp lea ecx,[ebp+0FFE8] mov [ecx],edx mov dword ptr [ecx+4],80 xor edx,edx mov [ebp+0FFE0],edx mov [ebp+0FFE4],edx push [ebp+10] push [ebp+0C] lea edx,[ebp+0FFE0] mov ecx,edi call System.String.MakeSeparatorList(System.ReadOnlySpan`1, System.Collections.Generic.ValueListBuilder`1 ByRef) mov eax,[ebp+0FFE4] cmp eax,[ebp+0FFEC] ja near ptr M01_L14 mov edx,[ebp+0FFE8] test eax,eax jne near ptr M01_L07 mov esi,1 M01_L01: mov eax,edi test bl,2 je short M01_L02 test esi,esi jle short M01_L02 cmp [edi],edi mov ecx,edi mov edx,3 call System.String.TrimWhiteSpaceHelper(System.Text.TrimType) mov edi,eax mov eax,edi M01_L02: test bl,1 je short M01_L03 mov [ebp+0FFDC],eax cmp dword ptr [eax+4],0 mov eax,[ebp+0FFDC] je short M01_L05 M01_L03: test esi,esi mov [ebp+0FFDC],eax je short M01_L05 mov ecx,offset MT_System.String[] mov edx,1 call CORINFO_HELP_NEWARR_1_OBJ lea edx,[eax+8] mov edi,[ebp+0FFDC] call CORINFO_HELP_ASSIGN_REF_EDI cmp dword ptr [ebp+0FFD8],3A78CFD3 je short M01_L04 call CORINFO_HELP_FAIL_FAST M01_L04: lea esp,[ebp+0FFF4] pop ebx pop esi pop edi pop ebp ret 0C M01_L05: mov ecx,51D0010 mov edx,29 call CORINFO_HELP_CLASSINIT_SHARED_DYNAMICCLASS mov eax,ds:[1EE4] cmp dword ptr [ebp+0FFD8],3A78CFD3 je short M01_L06 call CORINFO_HELP_FAIL_FAST M01_L06: lea esp,[ebp+0FFF4] pop ebx pop esi pop edi pop ebp ret 0C M01_L07: test ebx,ebx jne short M01_L08 xor ebx,ebx push eax push edx push 0 push ebx push esi mov ecx,edi mov edx,1 call System.String.SplitWithoutPostProcessing(System.ReadOnlySpan`1, System.ReadOnlySpan`1, Int32, Int32) mov edi,eax jmp short M01_L09 M01_L08: xor ecx,ecx push eax push edx push 0 push ecx push esi push ebx mov ecx,edi mov edx,1 call System.String.SplitWithPostProcessing(System.ReadOnlySpan`1, System.ReadOnlySpan`1, Int32, Int32, System.StringSplitOptions) mov edi,eax M01_L09: cmp dword ptr [ebp+0FFE0],0 je short M01_L10 mov ecx,51D0010 mov edx,2A call CORINFO_HELP_CLASSINIT_SHARED_DYNAMICCLASS mov ecx,ds:[1EE8] push 0 mov edx,[ebp+0FFE0] cmp [ecx],ecx call dword ptr ds:[0FC64] xor eax,eax mov [ebp+0FFE0],eax M01_L10: mov eax,edi cmp dword ptr [ebp+0FFD8],3A78CFD3 je short M01_L11 call CORINFO_HELP_FAIL_FAST M01_L11: lea esp,[ebp+0FFF4] pop ebx pop esi pop edi pop ebp ret 0C M01_L12: mov ecx,offset MT_System.ArgumentOutOfRangeException call CORINFO_HELP_NEWSFAST mov esi,eax mov ecx,1C9 mov edx,3384010 call CORINFO_HELP_STRCNS mov edi,eax mov ecx,0A1F1 mov edx,3384010 call CORINFO_HELP_STRCNS mov ecx,eax xor edx,edx call System.SR.GetResourceString(System.String, System.String) push eax mov edx,edi mov ecx,esi call System.ArgumentOutOfRangeException..ctor(System.String, System.String) mov ecx,esi call CORINFO_HELP_THROW M01_L13: mov ecx,42 mov edx,57 call System.ThrowHelper.ThrowArgumentException(System.ExceptionResource, System.ExceptionArgument) int 3 M01_L14: call System.ThrowHelper.ThrowArgumentOutOfRangeException() int 3 ; Total bytes of code 521 ``` ### Compare Jit Disasm ```assembly ; System.Tests.Perf_String.Split(System.String, Char[], System.StringSplitOptions) push ebp mov ebp,esp push esi mov ecx,[ebp+0C] cmp [edx],edx test ecx,ecx jne short M00_L00 xor eax,eax xor esi,esi jmp short M00_L01 M00_L00: lea eax,[ecx+8] mov esi,[ecx+4] M00_L01: push esi push eax mov ecx,[ebp+8] push ecx mov ecx,edx mov edx,7FFFFFFF call System.String.SplitInternal(System.ReadOnlySpan`1, Int32, System.StringSplitOptions) pop esi pop ebp ret 8 ; Total bytes of code 48 ``` ```assembly ; System.String.SplitInternal(System.ReadOnlySpan`1, Int32, System.StringSplitOptions) push ebp mov ebp,esp push edi push esi push ebx sub esp,1C vzeroupper xor eax,eax mov [ebp+0FFE0],eax mov [ebp+0FFE8],eax mov [ebp+0FFF0],esp mov dword ptr [ebp+0FFD8],81A10661 mov edi,ecx mov esi,edx mov ebx,[ebp+8] test esi,esi jl near ptr M01_L12 test ebx,0FFFFFFFC jne near ptr M01_L13 cmp esi,1 jle short M01_L01 cmp dword ptr [edi+4],0 je short M01_L01 cmp dword ptr [ebp+10],0 ja short M01_L00 and ebx,0FFFFFFFD M01_L00: test [esp],esp mov edx,esp sub edx,200 mov esp,edx lea edx,[esp] mov [ebp+0FFF0],esp lea ecx,[ebp+0FFE8] mov [ecx],edx mov dword ptr [ecx+4],80 xor edx,edx mov [ebp+0FFE0],edx mov [ebp+0FFE4],edx push [ebp+10] push [ebp+0C] lea edx,[ebp+0FFE0] mov ecx,edi call System.String.MakeSeparatorList(System.ReadOnlySpan`1, System.Collections.Generic.ValueListBuilder`1 ByRef) mov eax,[ebp+0FFE4] cmp eax,[ebp+0FFEC] ja near ptr M01_L14 mov edx,[ebp+0FFE8] test eax,eax jne near ptr M01_L07 mov esi,1 M01_L01: mov eax,edi test bl,2 je short M01_L02 test esi,esi jle short M01_L02 cmp [edi],edi mov ecx,edi mov edx,3 call System.String.TrimWhiteSpaceHelper(System.Text.TrimType) mov edi,eax mov eax,edi M01_L02: test bl,1 je short M01_L03 mov [ebp+0FFDC],eax cmp dword ptr [eax+4],0 mov eax,[ebp+0FFDC] je short M01_L05 M01_L03: test esi,esi mov [ebp+0FFDC],eax je short M01_L05 mov ecx,offset MT_System.String[] mov edx,1 call CORINFO_HELP_NEWARR_1_OBJ lea edx,[eax+8] mov edi,[ebp+0FFDC] call CORINFO_HELP_ASSIGN_REF_EDI cmp dword ptr [ebp+0FFD8],81A10661 je short M01_L04 call CORINFO_HELP_FAIL_FAST M01_L04: lea esp,[ebp+0FFF4] pop ebx pop esi pop edi pop ebp ret 0C M01_L05: mov ecx,3680010 mov edx,29 call CORINFO_HELP_CLASSINIT_SHARED_DYNAMICCLASS mov eax,ds:[1EEC] cmp dword ptr [ebp+0FFD8],81A10661 je short M01_L06 call CORINFO_HELP_FAIL_FAST M01_L06: lea esp,[ebp+0FFF4] pop ebx pop esi pop edi pop ebp ret 0C M01_L07: test ebx,ebx jne short M01_L08 xor ebx,ebx push eax push edx push 0 push ebx push esi mov ecx,edi mov edx,1 call System.String.SplitWithoutPostProcessing(System.ReadOnlySpan`1, System.ReadOnlySpan`1, Int32, Int32) mov edi,eax jmp short M01_L09 M01_L08: xor ecx,ecx push eax push edx push 0 push ecx push esi push ebx mov ecx,edi mov edx,1 call System.String.SplitWithPostProcessing(System.ReadOnlySpan`1, System.ReadOnlySpan`1, Int32, Int32, System.StringSplitOptions) mov edi,eax M01_L09: cmp dword ptr [ebp+0FFE0],0 je short M01_L10 mov ecx,3680010 mov edx,2A call CORINFO_HELP_CLASSINIT_SHARED_DYNAMICCLASS mov ecx,ds:[1EF0] push 0 mov edx,[ebp+0FFE0] cmp [ecx],ecx call dword ptr ds:[818] xor eax,eax mov [ebp+0FFE0],eax M01_L10: mov eax,edi cmp dword ptr [ebp+0FFD8],81A10661 je short M01_L11 call CORINFO_HELP_FAIL_FAST M01_L11: lea esp,[ebp+0FFF4] pop ebx pop esi pop edi pop ebp ret 0C M01_L12: mov ecx,offset MT_System.ArgumentOutOfRangeException call CORINFO_HELP_NEWSFAST mov esi,eax mov ecx,1C9 mov edx,2FD4010 call CORINFO_HELP_STRCNS mov edi,eax mov ecx,0A1F1 mov edx,2FD4010 call CORINFO_HELP_STRCNS mov ecx,eax xor edx,edx call System.SR.GetResourceString(System.String, System.String) push eax mov edx,edi mov ecx,esi call System.ArgumentOutOfRangeException..ctor(System.String, System.String) mov ecx,esi call CORINFO_HELP_THROW M01_L13: mov ecx,42 mov edx,57 call System.ThrowHelper.ThrowArgumentException(System.ExceptionResource, System.ExceptionArgument) int 3 M01_L14: call System.ThrowHelper.ThrowArgumentOutOfRangeException() int 3 ; Total bytes of code 521 ``` #### System.Tests.Perf_String.IndexerCheckPathLength ```log [121.503 ; 129.272) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [129.272 ; 137.041) | [137.041 ; 140.660) | [140.660 ; 148.428) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [148.428 ; 156.197) | [156.197 ; 163.495) | [163.495 ; 171.065) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [171.065 ; 178.834) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ``` ### Baseline Jit Disasm ```assembly ; System.Tests.Perf_String.IndexerCheckPathLength() push ebp mov ebp,esp push edi push esi push ebx push eax mov ecx,0AA91F80 mov edx,189 call CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE mov esi,ds:[520C] xor edi,edi xor ebx,ebx mov eax,[esi+4] mov [ebp+0FFF0],eax test eax,eax jle short M00_L01 M00_L00: mov ecx,esi mov edx,ebx call System.Tests.Perf_String.getStringCharNoInline(System.String, Int32) add edi,eax inc ebx mov eax,[ebp+0FFF0] cmp eax,ebx mov [ebp+0FFF0],eax jg short M00_L00 M00_L01: mov eax,edi pop ecx pop ebx pop esi pop edi pop ebp ret ; Total bytes of code 72 ``` ```assembly ; System.Tests.Perf_String.getStringCharNoInline(System.String, Int32) push ebp mov ebp,esp cmp edx,[ecx+4] jae short M01_L00 movzx eax,word ptr [ecx+edx*2+8] pop ebp ret M01_L00: call CORINFO_HELP_RNGCHKFAIL int 3 ; Total bytes of code 21 ``` ### Compare Jit Disasm ```assembly ; System.Tests.Perf_String.IndexerCheckPathLength() push ebp mov ebp,esp push edi push esi push ebx push eax mov ecx,0A6E1F98 mov edx,18A call CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE mov esi,ds:[5210] xor edi,edi xor ebx,ebx mov eax,[esi+4] mov [ebp+0FFF0],eax test eax,eax jle short M00_L01 M00_L00: mov ecx,esi mov edx,ebx call System.Tests.Perf_String.getStringCharNoInline(System.String, Int32) add edi,eax inc ebx mov eax,[ebp+0FFF0] cmp eax,ebx mov [ebp+0FFF0],eax jg short M00_L00 M00_L01: mov eax,edi pop ecx pop ebx pop esi pop edi pop ebp ret ; Total bytes of code 72 ``` ```assembly ; System.Tests.Perf_String.getStringCharNoInline(System.String, Int32) push ebp mov ebp,esp cmp edx,[ecx+4] jae short M01_L00 movzx eax,word ptr [ecx+edx*2+8] pop ebp ret M01_L00: call CORINFO_HELP_RNGCHKFAIL int 3 ; Total bytes of code 21 ``` #### System.Tests.Perf_String.Concat_CharEnumerable ```log [6908.540 ; 7204.589) | @@@@@@@@@@@@@@@@@@@@@@@@@ [7204.589 ; 7486.312) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [7486.312 ; 7789.107) | @@@@@@@@@@@@@@@@@@ [7789.107 ; 8068.054) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [8068.054 ; 8496.213) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ``` ### Baseline Jit Disasm ```assembly ; System.Tests.Perf_String.Concat_CharEnumerable() mov ecx,ds:[5204] call System.String.Concat[[System.Char, System.Private.CoreLib]](System.Collections.Generic.IEnumerable`1) ret ; Total bytes of code 12 ``` ```assembly ; System.String.Concat[[System.Char, System.Private.CoreLib]](System.Collections.Generic.IEnumerable`1) push ebp mov ebp,esp push esi sub esp,34 vxorps xmm4,xmm4,xmm4 vmovdqu xmmword ptr [ebp+0FFCC],xmm4 xor eax,eax mov [ebp+0FFDC],eax mov [ebp+0FFE0],eax mov [ebp+0FFEC],eax mov [ebp+0FFF8],esp mov dword ptr [ebp+0FFC8],4BFE3CEB test ecx,ecx je near ptr M01_L13 call dword ptr ds:[26C] mov [ebp+0FFD0],eax mov ecx,[ebp+0FFD0] call dword ptr ds:[270] test eax,eax jne short M01_L00 mov ecx,ds:[2018] mov [ebp+0FFCC],ecx mov dword ptr [ebp+0FFE8],0 mov dword ptr [ebp+0FFEC],0FC push offset M01_L07 jmp near ptr M01_L09 M01_L00: mov ecx,[ebp+0FFD0] call dword ptr ds:[274] mov esi,eax mov ecx,[ebp+0FFD0] call dword ptr ds:[278] test eax,eax jne short M01_L01 mov ecx,1 call System.String.FastAllocateString(Int32) mov [eax+8],si mov [ebp+0FFCC],eax mov dword ptr [ebp+0FFE8],0 mov dword ptr [ebp+0FFEC],0FC push offset M01_L08 jmp near ptr M01_L09 M01_L01: test [esp],esp mov ecx,esp sub ecx,200 mov esp,ecx lea ecx,[esp] mov [ebp+0FFF8],esp xor edx,edx mov [ebp+0FFD4],edx lea edx,[ebp+0FFDC] mov [edx],ecx mov dword ptr [edx+4],100 xor ecx,ecx mov [ebp+0FFD8],ecx mov ecx,[ebp+0FFD8] cmp ecx,[ebp+0FFE0] jae short M01_L03 lea edx,[ebp+0FFDC] cmp ecx,[edx+4] jae short M01_L02 mov edx,[edx] mov [edx+ecx*2],si inc ecx mov [ebp+0FFD8],ecx jmp short M01_L04 M01_L02: call CORINFO_HELP_RNGCHKFAIL M01_L03: lea ecx,[ebp+0FFD4] mov edx,esi call System.Text.ValueStringBuilder.GrowAndAppend(Char) M01_L04: mov ecx,[ebp+0FFD0] call dword ptr ds:[27C] mov esi,eax mov ecx,[ebp+0FFD8] cmp ecx,[ebp+0FFE0] jae short M01_L05 lea edx,[ebp+0FFDC] cmp ecx,[edx+4] jae short M01_L02 mov edx,[edx] mov [edx+ecx*2],si inc ecx mov [ebp+0FFD8],ecx jmp short M01_L06 M01_L05: lea ecx,[ebp+0FFD4] mov edx,esi call System.Text.ValueStringBuilder.GrowAndAppend(Char) M01_L06: mov ecx,[ebp+0FFD0] call dword ptr ds:[280] test eax,eax jne short M01_L04 lea ecx,[ebp+0FFD4] call System.Text.ValueStringBuilder.ToString() mov [ebp+0FFCC],eax mov ecx,[ebp+0FFD0] call dword ptr ds:[284] jmp short M01_L11 M01_L07: mov dword ptr [ebp+0FFEC],0 jmp short M01_L11 M01_L08: mov dword ptr [ebp+0FFEC],0 jmp short M01_L11 M01_L09: cmp dword ptr [ebp+0FFD0],0 je short M01_L10 mov ecx,[ebp+0FFD0] call dword ptr ds:[284] M01_L10: pop eax jmp eax M01_L11: mov eax,[ebp+0FFCC] cmp dword ptr [ebp+0FFC8],4BFE3CEB je short M01_L12 call CORINFO_HELP_FAIL_FAST M01_L12: lea esp,[ebp+0FFFC] pop esi pop ebp ret M01_L13: mov ecx,offset MT_System.ArgumentNullException call CORINFO_HELP_NEWSFAST mov esi,eax mov ecx,19E8 mov edx,7F4010 call CORINFO_HELP_STRCNS mov edx,eax mov ecx,esi call System.ArgumentNullException..ctor(System.String) mov ecx,esi call CORINFO_HELP_THROW int 3 ; Total bytes of code 436 ``` ### Compare Jit Disasm ```assembly ; System.Tests.Perf_String.Concat_CharEnumerable() mov ecx,ds:[5208] call System.String.Concat[[System.Char, System.Private.CoreLib]](System.Collections.Generic.IEnumerable`1) ret ; Total bytes of code 12 ``` ```assembly ; System.String.Concat[[System.Char, System.Private.CoreLib]](System.Collections.Generic.IEnumerable`1) push ebp mov ebp,esp push edi push esi sub esp,34 vxorps xmm4,xmm4,xmm4 vmovdqu xmmword ptr [ebp+0FFC8],xmm4 xor eax,eax mov [ebp+0FFD8],eax mov [ebp+0FFDC],eax mov [ebp+0FFE8],eax mov [ebp+0FFF4],esp mov dword ptr [ebp+0FFC4],0E991E18B test ecx,ecx je near ptr M01_L13 call dword ptr ds:[260] mov esi,eax mov [ebp+0FFCC],esi mov ecx,esi call dword ptr ds:[264] test eax,eax jne short M01_L00 mov ecx,ds:[2018] mov [ebp+0FFC8],ecx mov dword ptr [ebp+0FFE4],0 mov dword ptr [ebp+0FFE8],0FC push offset M01_L07 jmp near ptr M01_L09 M01_L00: mov ecx,esi call dword ptr ds:[268] mov edi,eax mov ecx,esi call dword ptr ds:[26C] test eax,eax jne short M01_L01 mov ecx,1 call System.String.FastAllocateString(Int32) mov [eax+8],di mov [ebp+0FFC8],eax mov dword ptr [ebp+0FFE4],0 mov dword ptr [ebp+0FFE8],0FC push offset M01_L08 jmp near ptr M01_L09 M01_L01: test [esp],esp mov ecx,esp sub ecx,200 mov esp,ecx lea ecx,[esp] mov [ebp+0FFF4],esp xor edx,edx mov [ebp+0FFD0],edx lea edx,[ebp+0FFD8] mov [edx],ecx mov dword ptr [edx+4],100 xor ecx,ecx mov [ebp+0FFD4],ecx mov ecx,[ebp+0FFD4] cmp ecx,[ebp+0FFDC] jae short M01_L03 lea edx,[ebp+0FFD8] cmp ecx,[edx+4] jae short M01_L02 mov edx,[edx] mov [edx+ecx*2],di inc ecx mov [ebp+0FFD4],ecx jmp short M01_L04 M01_L02: call CORINFO_HELP_RNGCHKFAIL M01_L03: lea ecx,[ebp+0FFD0] mov edx,edi call System.Text.ValueStringBuilder.GrowAndAppend(Char) M01_L04: mov ecx,esi call dword ptr ds:[270] mov edi,eax mov ecx,[ebp+0FFD4] cmp ecx,[ebp+0FFDC] jae short M01_L05 lea edx,[ebp+0FFD8] cmp ecx,[edx+4] jae short M01_L02 mov edx,[edx] mov [edx+ecx*2],di inc ecx mov [ebp+0FFD4],ecx jmp short M01_L06 M01_L05: lea ecx,[ebp+0FFD0] mov edx,edi call System.Text.ValueStringBuilder.GrowAndAppend(Char) M01_L06: mov ecx,esi call dword ptr ds:[274] test eax,eax jne short M01_L04 lea ecx,[ebp+0FFD0] call System.Text.ValueStringBuilder.ToString() mov [ebp+0FFC8],eax mov ecx,esi call dword ptr ds:[278] jmp short M01_L11 M01_L07: mov dword ptr [ebp+0FFE8],0 jmp short M01_L11 M01_L08: mov dword ptr [ebp+0FFE8],0 jmp short M01_L11 M01_L09: mov esi,[ebp+0FFCC] test esi,esi je short M01_L10 mov ecx,esi call dword ptr ds:[278] M01_L10: pop eax jmp eax M01_L11: mov eax,[ebp+0FFC8] cmp dword ptr [ebp+0FFC4],0E991E18B je short M01_L12 call CORINFO_HELP_FAIL_FAST M01_L12: lea esp,[ebp+0FFF8] pop esi pop edi pop ebp ret M01_L13: mov ecx,offset MT_System.ArgumentNullException call CORINFO_HELP_NEWSFAST mov esi,eax mov ecx,19E8 mov edx,3E4010 call CORINFO_HELP_STRCNS mov edx,eax mov ecx,esi call System.ArgumentNullException..ctor(System.String) mov ecx,esi call CORINFO_HELP_THROW int 3 ; Total bytes of code 434 ``` #### System.Tests.Perf_String.Format_MultipleArgs ```log [403.580 ; 416.318) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [416.318 ; 426.596) | @@@ [426.596 ; 443.418) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [443.418 ; 459.645) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [459.645 ; 483.361) | @@@@@@@@ ``` ### Baseline Jit Disasm ```assembly ; System.Tests.Perf_String.Format_MultipleArgs() push esi mov ecx,offset MT_System.Object[] mov edx,8 call CORINFO_HELP_NEWARR_1_OBJ mov esi,eax mov ecx,offset MT_System.Char call CORINFO_HELP_NEWSFAST mov word ptr [eax+4],31 lea edx,[esi+8] call CORINFO_HELP_ASSIGN_REF_EAX lea edx,[esi+0C] mov ecx,ds:[3B84] call CORINFO_HELP_ASSIGN_REF_ECX lea edx,[esi+10] call CORINFO_HELP_ASSIGN_REF_ECX lea edx,[esi+14] call CORINFO_HELP_ASSIGN_REF_ECX lea edx,[esi+18] call CORINFO_HELP_ASSIGN_REF_ECX lea edx,[esi+1C] call CORINFO_HELP_ASSIGN_REF_ECX lea edx,[esi+20] call CORINFO_HELP_ASSIGN_REF_ECX lea edx,[esi+24] call CORINFO_HELP_ASSIGN_REF_ECX mov ecx,ds:[3B88] mov edx,esi call System.String.Format(System.String, System.Object[]) pop esi ret ; Total bytes of code 119 ``` ```assembly ; System.String.Format(System.String, System.Object[]) push ebp mov ebp,esp push edi push esi sub esp,10 vzeroupper xor eax,eax mov [ebp+0FFE8],eax mov [ebp+0FFEC],eax mov [ebp+0FFF0],eax mov [ebp+0FFF4],eax mov esi,ecx test edx,edx je short M01_L00 lea ecx,[ebp+0FFE8] call System.ParamsArray..ctor(System.Object[]) push [ebp+0FFF4] push [ebp+0FFF0] push [ebp+0FFEC] push [ebp+0FFE8] mov edx,esi xor ecx,ecx call System.String.FormatHelper(System.IFormatProvider, System.String, System.ParamsArray) lea esp,[ebp+0FFF8] pop esi pop edi pop ebp ret M01_L00: test esi,esi je short M01_L01 mov esi,ds:[3B8C] jmp short M01_L02 M01_L01: mov esi,ds:[37C8] M01_L02: mov ecx,offset MT_System.ArgumentNullException call CORINFO_HELP_NEWSFAST mov edi,eax mov ecx,edi mov edx,esi call System.ArgumentNullException..ctor(System.String) mov ecx,edi call CORINFO_HELP_THROW int 3 ; Total bytes of code 114 ``` ### Compare Jit Disasm ```assembly ; System.Tests.Perf_String.Format_MultipleArgs() push esi mov ecx,offset MT_System.Object[] mov edx,8 call CORINFO_HELP_NEWARR_1_OBJ mov esi,eax mov ecx,offset MT_System.Char call CORINFO_HELP_NEWSFAST mov word ptr [eax+4],31 lea edx,[esi+8] call CORINFO_HELP_ASSIGN_REF_EAX lea edx,[esi+0C] mov ecx,ds:[3B90] call CORINFO_HELP_ASSIGN_REF_ECX lea edx,[esi+10] call CORINFO_HELP_ASSIGN_REF_ECX lea edx,[esi+14] call CORINFO_HELP_ASSIGN_REF_ECX lea edx,[esi+18] call CORINFO_HELP_ASSIGN_REF_ECX lea edx,[esi+1C] call CORINFO_HELP_ASSIGN_REF_ECX lea edx,[esi+20] call CORINFO_HELP_ASSIGN_REF_ECX lea edx,[esi+24] call CORINFO_HELP_ASSIGN_REF_ECX mov ecx,ds:[3B94] mov edx,esi call System.String.Format(System.String, System.Object[]) pop esi ret ; Total bytes of code 119 ``` ```assembly ; System.String.Format(System.String, System.Object[]) push ebp mov ebp,esp push edi push esi sub esp,10 vzeroupper xor eax,eax mov [ebp+0FFE8],eax mov [ebp+0FFEC],eax mov [ebp+0FFF0],eax mov [ebp+0FFF4],eax mov esi,ecx test edx,edx je short M01_L00 lea ecx,[ebp+0FFE8] call System.ParamsArray..ctor(System.Object[]) push [ebp+0FFF4] push [ebp+0FFF0] push [ebp+0FFEC] push [ebp+0FFE8] mov edx,esi xor ecx,ecx call System.String.FormatHelper(System.IFormatProvider, System.String, System.ParamsArray) lea esp,[ebp+0FFF8] pop esi pop edi pop ebp ret M01_L00: test esi,esi je short M01_L01 mov esi,ds:[3B98] jmp short M01_L02 M01_L01: mov esi,ds:[37D0] M01_L02: mov ecx,offset MT_System.ArgumentNullException call CORINFO_HELP_NEWSFAST mov edi,eax mov ecx,edi mov edx,esi call System.ArgumentNullException..ctor(System.String) mov ecx,edi call CORINFO_HELP_THROW int 3 ; Total bytes of code 114 ``` ### 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 3 years ago

Run Information

Architecture x86
OS Windows 10.0.18362
Baseline 6ce5878104d61cbdbfa6eb5db959bfc63e1e8596
Compare 027c093de1cc7d23a107e0594cebfb0216161dd4

Improvemnts in PerfLabTests.CastingPerf

Benchmark Baseline Test Test/Base Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
[CheckArrayIsNonvariantGenericInterface](<https://pvscmdupload.blob.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/PerfLabTests.CastingPerf.CheckArrayIsNonvariantGenericInterface.html>) 9.36 ns 7.50 ns 0.80 Trace Trace
[CheckIsInstAnyIsInterfaceNo](<https://pvscmdupload.blob.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/PerfLabTests.CastingPerf.CheckIsInstAnyIsInterfaceNo.html>) 405.59 μs 280.64 μs 0.69 Trace Trace
[FooObjCastIfIsa](<https://pvscmdupload.blob.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/PerfLabTests.CastingPerf.FooObjCastIfIsa.html>) 762.94 μs 670.80 μs 0.88 Trace Trace
[CheckIsInstAnyIsInterfaceYes](<https://pvscmdupload.blob.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/PerfLabTests.CastingPerf.CheckIsInstAnyIsInterfaceYes.html>) 405.37 μs 249.47 μs 0.62 Trace Trace
[CheckObjIsInterfaceNo](<https://pvscmdupload.blob.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/PerfLabTests.CastingPerf.CheckObjIsInterfaceNo.html>) 405.39 μs 280.63 μs 0.69 Trace Trace
[CheckObjIsInterfaceYes](<https://pvscmdupload.blob.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/PerfLabTests.CastingPerf.CheckObjIsInterfaceYes.html>) 405.37 μs 249.48 μs 0.62 Trace Trace

graph graph graph graph graph graph Historical Data in Reporting System

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f netcoreapp5.0 --filter 'PerfLabTests.CastingPerf*'
. ### Payloads [Baseline]() [Compare]() ### Histogram #### PerfLabTests.CastingPerf.CheckArrayIsNonvariantGenericInterface ```log [ 6.916 ; 7.519) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [ 7.519 ; 8.188) | @@ [ 8.188 ; 8.791) | @@@@@@@@@ [ 8.791 ; 9.012) | [ 9.012 ; 9.616) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [ 9.616 ; 10.272) | @@@@@@@@@@@@@@ [10.272 ; 11.035) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [11.035 ; 11.638) | @@@ [11.638 ; 11.871) | [11.871 ; 12.475) | @@@@@@@@@@@@@@@@@@@@@@@@@@ [12.475 ; 13.079) | @@@ [13.079 ; 13.820) | @@@@@@@ [13.820 ; 14.363) | [14.363 ; 14.966) | @@@ [14.966 ; 15.376) | [15.376 ; 15.980) | @ [15.980 ; 16.341) | [16.341 ; 16.944) | @@ [16.944 ; 17.548) | [17.548 ; 18.151) | [18.151 ; 18.754) | [18.754 ; 19.357) | [19.357 ; 20.018) | [20.018 ; 20.622) | @ ``` ### Baseline Jit Disasm ```assembly ; PerfLabTests.CastingPerf.CheckArrayIsNonvariantGenericInterface() mov edx,ds:[4F00] mov ecx,offset MT_System.Collections.Generic.ICollection`1[[PerfLabTests.MyClass2, MicroBenchmarks]] call CORINFO_HELP_ISINSTANCEOFINTERFACE test eax,eax setne al movzx eax,al ret ; Total bytes of code 25 ``` ### Compare Jit Disasm ```assembly ; PerfLabTests.CastingPerf.CheckArrayIsNonvariantGenericInterface() mov edx,ds:[4F00] mov ecx,offset MT_System.Collections.Generic.ICollection`1[[PerfLabTests.MyClass2, MicroBenchmarks]] call CORINFO_HELP_ISINSTANCEOFINTERFACE test eax,eax setne al movzx eax,al ret ; Total bytes of code 25 ``` #### PerfLabTests.CastingPerf.CheckIsInstAnyIsInterfaceNo ```log [278588.990 ; 295997.061) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [295997.061 ; 313405.132) | [313405.132 ; 330813.204) | [330813.204 ; 351739.089) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [351739.089 ; 369147.160) | [369147.160 ; 386555.231) | [386555.231 ; 396859.089) | [396859.089 ; 414486.803) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ``` ### Baseline Jit Disasm ```assembly ; PerfLabTests.CastingPerf.CheckIsInstAnyIsInterfaceNo() push ebp mov ebp,esp push edi push esi xor eax,eax xor esi,esi mov edi,ds:[24C0] test edi,edi jle short M00_L01 M00_L00: mov edx,ds:[4EF4] mov ecx,offset MT_PerfLabTests.IMyInterface2 call CORINFO_HELP_ISINSTANCEOFINTERFACE test eax,eax setne al movzx eax,al inc esi cmp esi,edi jl short M00_L00 M00_L01: pop esi pop edi pop ebp ret ; Total bytes of code 52 ``` ### Compare Jit Disasm ```assembly ; PerfLabTests.CastingPerf.CheckIsInstAnyIsInterfaceNo() push ebp mov ebp,esp push edi push esi xor eax,eax xor esi,esi mov edi,ds:[24D8] test edi,edi jle short M00_L01 M00_L00: mov edx,ds:[4EF4] mov ecx,offset MT_PerfLabTests.IMyInterface2 call CORINFO_HELP_ISINSTANCEOFINTERFACE test eax,eax setne al movzx eax,al inc esi cmp esi,edi jl short M00_L00 M00_L01: pop esi pop edi pop ebp ret ; Total bytes of code 52 ``` #### PerfLabTests.CastingPerf.FooObjCastIfIsa ```log [582005.457 ; 602960.722) | @@@@@@@@@@@@@@@@ [602960.722 ; 624213.695) | @ [624213.695 ; 645151.894) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [645151.894 ; 673732.401) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [673732.401 ; 695437.374) | @@@@@@ [695437.374 ; 723034.472) | @@@@@@@@@@@@@@@@ [723034.472 ; 754411.039) | @@ [754411.039 ; 775349.239) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [775349.239 ; 794476.461) | @@ ``` ### Baseline Jit Disasm ```assembly ; PerfLabTests.CastingPerf.FooObjCastIfIsa() push ebp mov ebp,esp push edi push esi push eax xor eax,eax mov [ebp+0FFF4],eax xor esi,esi mov edi,ds:[24C0] test edi,edi jle short M00_L02 M00_L00: mov edx,ds:[4ED8] mov ecx,offset MT_PerfLabTests.Foo[] call CORINFO_HELP_ISINSTANCEOFARRAY test eax,eax je short M00_L01 lea edx,ds:[4EE0] mov [ebp+0FFF4],edx mov edx,ds:[4ED8] mov ecx,offset MT_PerfLabTests.Foo[] call CORINFO_HELP_CHKCASTARRAY mov edx,[ebp+0FFF4] call CORINFO_HELP_CHECKED_ASSIGN_REF_EAX M00_L01: inc esi cmp esi,edi jl short M00_L00 M00_L02: pop ecx pop esi pop edi pop ebp ret ; Total bytes of code 86 ``` ### Compare Jit Disasm ```assembly ; PerfLabTests.CastingPerf.FooObjCastIfIsa() push ebp mov ebp,esp push edi push esi push eax xor eax,eax mov [ebp+0FFF4],eax xor esi,esi mov edi,ds:[24D8] test edi,edi jle short M00_L02 M00_L00: mov edx,ds:[4ED8] mov ecx,offset MT_PerfLabTests.Foo[] call CORINFO_HELP_ISINSTANCEOFARRAY test eax,eax je short M00_L01 lea edx,ds:[4EE0] mov [ebp+0FFF4],edx mov edx,ds:[4ED8] mov ecx,offset MT_PerfLabTests.Foo[] call CORINFO_HELP_CHKCASTARRAY mov edx,[ebp+0FFF4] call CORINFO_HELP_CHECKED_ASSIGN_REF_EAX M00_L01: inc esi cmp esi,edi jl short M00_L00 M00_L02: pop ecx pop esi pop edi pop ebp ret ; Total bytes of code 86 ``` #### PerfLabTests.CastingPerf.CheckIsInstAnyIsInterfaceYes ```log [238783.738 ; 260197.945) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [260197.945 ; 281543.181) | [281543.181 ; 302888.416) | [302888.416 ; 324233.651) | [324233.651 ; 338207.394) | [338207.394 ; 359552.629) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [359552.629 ; 380362.849) | @ [380362.849 ; 395596.004) | [395596.004 ; 417877.906) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ``` ### Baseline Jit Disasm ```assembly ; PerfLabTests.CastingPerf.CheckIsInstAnyIsInterfaceYes() push ebp mov ebp,esp push edi push esi xor eax,eax xor esi,esi mov edi,ds:[24C0] test edi,edi jle short M00_L01 M00_L00: mov edx,ds:[4EF4] mov ecx,offset MT_PerfLabTests.IMyInterface1 call CORINFO_HELP_ISINSTANCEOFINTERFACE test eax,eax setne al movzx eax,al inc esi cmp esi,edi jl short M00_L00 M00_L01: pop esi pop edi pop ebp ret ; Total bytes of code 52 ``` ### Compare Jit Disasm ```assembly ; PerfLabTests.CastingPerf.CheckIsInstAnyIsInterfaceYes() push ebp mov ebp,esp push edi push esi xor eax,eax xor esi,esi mov edi,ds:[24D8] test edi,edi jle short M00_L01 M00_L00: mov edx,ds:[4EF4] mov ecx,offset MT_PerfLabTests.IMyInterface1 call CORINFO_HELP_ISINSTANCEOFINTERFACE test eax,eax setne al movzx eax,al inc esi cmp esi,edi jl short M00_L00 M00_L01: pop esi pop edi pop ebp ret ; Total bytes of code 52 ``` #### PerfLabTests.CastingPerf.CheckObjIsInterfaceNo ```log [271907.635 ; 289349.535) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [289349.535 ; 296962.810) | [296962.810 ; 314387.670) | @ [314387.670 ; 334317.149) | [334317.149 ; 351742.009) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [351742.009 ; 369166.868) | [369166.868 ; 386591.728) | [386591.728 ; 396805.102) | [396805.102 ; 414402.280) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ``` ### Baseline Jit Disasm ```assembly ; PerfLabTests.CastingPerf.CheckObjIsInterfaceNo() push ebp mov ebp,esp push edi push esi xor eax,eax xor esi,esi mov edi,ds:[24C0] test edi,edi jle short M00_L01 M00_L00: mov edx,ds:[4EF0] mov ecx,offset MT_PerfLabTests.IMyInterface1 call CORINFO_HELP_ISINSTANCEOFINTERFACE test eax,eax setne al movzx eax,al inc esi cmp esi,edi jl short M00_L00 M00_L01: pop esi pop edi pop ebp ret ; Total bytes of code 52 ``` ### Compare Jit Disasm ```assembly ; PerfLabTests.CastingPerf.CheckObjIsInterfaceNo() push ebp mov ebp,esp push edi push esi xor eax,eax xor esi,esi mov edi,ds:[24D8] test edi,edi jle short M00_L01 M00_L00: mov edx,ds:[4EF0] mov ecx,offset MT_PerfLabTests.IMyInterface1 call CORINFO_HELP_ISINSTANCEOFINTERFACE test eax,eax setne al movzx eax,al inc esi cmp esi,edi jl short M00_L00 M00_L01: pop esi pop edi pop ebp ret ; Total bytes of code 52 ``` #### PerfLabTests.CastingPerf.CheckObjIsInterfaceYes ```log [238705.851 ; 262016.795) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [262016.795 ; 283511.701) | [283511.701 ; 305006.607) | [305006.607 ; 326501.513) | [326501.513 ; 353769.218) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [353769.218 ; 375264.123) | [375264.123 ; 395436.361) | [395436.361 ; 417781.508) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ``` ### Baseline Jit Disasm ```assembly ; PerfLabTests.CastingPerf.CheckObjIsInterfaceYes() push ebp mov ebp,esp push edi push esi xor eax,eax xor esi,esi mov edi,ds:[24C0] test edi,edi jle short M00_L01 M00_L00: mov edx,ds:[4EEC] mov ecx,offset MT_PerfLabTests.IMyInterface1 call CORINFO_HELP_ISINSTANCEOFINTERFACE test eax,eax setne al movzx eax,al inc esi cmp esi,edi jl short M00_L00 M00_L01: pop esi pop edi pop ebp ret ; Total bytes of code 52 ``` ### Compare Jit Disasm ```assembly ; PerfLabTests.CastingPerf.CheckObjIsInterfaceYes() push ebp mov ebp,esp push edi push esi xor eax,eax xor esi,esi mov edi,ds:[24D8] test edi,edi jle short M00_L01 M00_L00: mov edx,ds:[4EEC] mov ecx,offset MT_PerfLabTests.IMyInterface1 call CORINFO_HELP_ISINSTANCEOFINTERFACE test eax,eax setne al movzx eax,al inc esi cmp esi,edi jl short M00_L00 M00_L01: pop esi pop edi pop ebp ret ; Total bytes of code 52 ``` ### 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 | [6ce5878104d61cbdbfa6eb5db959bfc63e1e8596](https://github.com/dotnet/runtime/commit/6ce5878104d61cbdbfa6eb5db959bfc63e1e8596) Compare | [027c093de1cc7d23a107e0594cebfb0216161dd4](https://github.com/dotnet/runtime/commit/027c093de1cc7d23a107e0594cebfb0216161dd4) ### Improvemnts in PerfLabTests.CastingPerf2.CastingPerf Benchmark | Baseline | Test | Test/Base | Baseline IR | Compare IR | IR Ratio | Baseline ETL | Compare ETL -- | -- | -- | -- | -- | -- | -- | -- | -- [IFooObjIsDescendantOfIFoo]() | 654.87 μs | 618.61 μs | 0.94 | | | | [Trace](https://helixri107v0xdeko0k025g8.blob.core.windows.net/results-89a68802c5f04cdea3/Collect%20PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsDescendantOfIFoo/artifacts/BenchmarkDotNet.Artifacts/PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsDescendantOfIFoo-20210316-050511.etl?sv=2019-07-07&se=2021-06-14T12%3A01%3A45Z&sr=c&sp=rl&sig=NdyuHXVOB83UCOXI2F%2FddgJ6Wm27PNcGaOsXLEAK7x4%3D) | [Trace](https://helixri107v0xdeko0k025g8.blob.core.windows.net/results-10016d6ab45343fdaf/Collect%20PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsDescendantOfIFoo/artifacts/BenchmarkDotNet.Artifacts/PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsDescendantOfIFoo-20210316-050512.etl?sv=2019-07-07&se=2021-06-14T12%3A01%3A46Z&sr=c&sp=rl&sig=UdKHArcxYu%2B3Wa5TReFsI8doRZabMp0ouH1ulO5qjzI%3D) [IFooObjIsIFoo]() | 654.83 μs | 617.55 μs | 0.94 | | | | [Trace](https://helixri107v0xdeko0k025g8.blob.core.windows.net/results-38a500fd832944798a/Collect%20PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsIFoo/artifacts/BenchmarkDotNet.Artifacts/PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsIFoo-20210316-050820.etl?sv=2019-07-07&se=2021-06-14T12%3A03%3A01Z&sr=c&sp=rl&sig=k%2BzCUpORQRK6Arh0Bizx7T%2FKBGx2lrHSLZgYZY6LPUQ%3D) | [Trace](https://helixri107v0xdeko0k025g8.blob.core.windows.net/results-c6c52908449045d98c/Collect%20PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsIFoo/artifacts/BenchmarkDotNet.Artifacts/PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsIFoo-20210316-050824.etl?sv=2019-07-07&se=2021-06-14T12%3A03%3A02Z&sr=c&sp=rl&sig=vppyO6%2FhH3pFJDNjMCv%2FFCbBw%2Fj9dVhSe8xpiCBrVbo%3D) [IFooObjIsIFooInterAlia]() | 498.93 μs | 467.32 μs | 0.94 | | | | [Trace](https://helixri107v0xdeko0k025g8.blob.core.windows.net/results-654b1a9ab7674caead/Collect%20PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsIFooInterAlia/artifacts/BenchmarkDotNet.Artifacts/PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsIFooInterAlia-20210316-050755.etl?sv=2019-07-07&se=2021-06-14T12%3A03%3A12Z&sr=c&sp=rl&sig=Q%2BEcjjQkcOLSdh8jNtRRZJt7jIVknWbm0hgUDpYeyJc%3D) | [Trace](https://helixri107v0xdeko0k025g8.blob.core.windows.net/results-28811fb835054551b5/Collect%20PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsIFooInterAlia/artifacts/BenchmarkDotNet.Artifacts/PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsIFooInterAlia-20210316-050800.etl?sv=2019-07-07&se=2021-06-14T12%3A03%3A12Z&sr=c&sp=rl&sig=GShN8iIAuxxW14ljJLD4PJbBz3USjE1t%2FrbkafzuFv8%3D) ![graph]() ![graph]() ![graph]() [Historical Data in Reporting System]() ### Repro ```cmd git clone https://github.com/dotnet/performance.git py .\performance\scripts\benchmarks_ci.py -f netcoreapp5.0 --filter 'PerfLabTests.CastingPerf2.CastingPerf*' ```
. ### Payloads [Baseline]() [Compare]() ### Histogram #### PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsDescendantOfIFoo ```log [514140.440 ; 525826.490) | @@@ [525826.490 ; 542205.739) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [542205.739 ; 564418.113) | @ [564418.113 ; 580797.363) | @@@@@@@@@@@@@@@@@@@@@ [580797.363 ; 597176.612) | [597176.612 ; 624495.850) | @@@@@@ [624495.850 ; 640875.099) | [640875.099 ; 654740.342) | [654740.342 ; 671119.591) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [671119.591 ; 687600.510) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [687600.510 ; 704178.608) | @@@@@ [704178.608 ; 720557.857) | [720557.857 ; 740378.284) | @@@ [740378.284 ; 769314.377) | @ ``` ### Baseline Jit Disasm ```assembly ; PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsDescendantOfIFoo() push ebp mov ebp,esp push edi push esi push eax xor eax,eax mov [ebp+0FFF4],eax xor esi,esi mov edi,ds:[2534] test edi,edi jle short M00_L01 M00_L00: lea edx,ds:[504C] mov [ebp+0FFF4],edx mov edx,ds:[4FFC] mov ecx,offset MT_PerfLabTests.CastingPerf2.IFoo call CORINFO_HELP_CHKCASTINTERFACE mov edx,[ebp+0FFF4] call CORINFO_HELP_CHECKED_ASSIGN_REF_EAX inc esi cmp esi,edi jl short M00_L00 M00_L01: pop ecx pop esi pop edi pop ebp ret ; Total bytes of code 66 ``` ### Compare Jit Disasm ```assembly ; PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsDescendantOfIFoo() push ebp mov ebp,esp push edi push esi push eax xor eax,eax mov [ebp+0FFF4],eax xor esi,esi mov edi,ds:[254C] test edi,edi jle short M00_L01 M00_L00: lea edx,ds:[504C] mov [ebp+0FFF4],edx mov edx,ds:[4FFC] mov ecx,offset MT_PerfLabTests.CastingPerf2.IFoo call CORINFO_HELP_CHKCASTINTERFACE mov edx,[ebp+0FFF4] call CORINFO_HELP_CHECKED_ASSIGN_REF_EAX inc esi cmp esi,edi jl short M00_L00 M00_L01: pop ecx pop esi pop edi pop ebp ret ; Total bytes of code 66 ``` #### PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsIFoo ```log [513199.716 ; 538801.062) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [538801.062 ; 558598.861) | @@@ [558598.861 ; 574824.148) | @@@@@@@@@@@@@@@@@@@@ [574824.148 ; 591049.435) | [591049.435 ; 609149.560) | [609149.560 ; 625374.847) | @@@@@@ [625374.847 ; 641600.134) | [641600.134 ; 654716.057) | [654716.057 ; 670941.344) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [670941.344 ; 686387.052) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [686387.052 ; 703193.242) | @@@@@@@@@ ``` ### Baseline Jit Disasm ```assembly ; PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsIFoo() push ebp mov ebp,esp push edi push esi push eax xor eax,eax mov [ebp+0FFF4],eax xor esi,esi mov edi,ds:[2534] test edi,edi jle short M00_L01 M00_L00: lea edx,ds:[504C] mov [ebp+0FFF4],edx mov edx,ds:[4FFC] mov ecx,offset MT_PerfLabTests.CastingPerf2.IFoo call CORINFO_HELP_CHKCASTINTERFACE mov edx,[ebp+0FFF4] call CORINFO_HELP_CHECKED_ASSIGN_REF_EAX inc esi cmp esi,edi jl short M00_L00 M00_L01: pop ecx pop esi pop edi pop ebp ret ; Total bytes of code 66 ``` ### Compare Jit Disasm ```assembly ; PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsIFoo() push ebp mov ebp,esp push edi push esi push eax xor eax,eax mov [ebp+0FFF4],eax xor esi,esi mov edi,ds:[254C] test edi,edi jle short M00_L01 M00_L00: lea edx,ds:[504C] mov [ebp+0FFF4],edx mov edx,ds:[4FFC] mov ecx,offset MT_PerfLabTests.CastingPerf2.IFoo call CORINFO_HELP_CHKCASTINTERFACE mov edx,[ebp+0FFF4] call CORINFO_HELP_CHECKED_ASSIGN_REF_EAX inc esi cmp esi,edi jl short M00_L00 M00_L01: pop ecx pop esi pop edi pop ebp ret ; Total bytes of code 66 ``` #### PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsIFooInterAlia ```log [436411.042 ; 445443.047) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [445443.047 ; 454720.882) | @@@@@@@@ [454720.882 ; 468602.862) | @@@@@@@ [468602.862 ; 487219.146) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [487219.146 ; 498264.219) | @ [498264.219 ; 516171.117) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [516171.117 ; 533996.335) | @@@@@@@@@@@@@@@@@@@@@@ ``` ### Baseline Jit Disasm ```assembly ; PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsIFooInterAlia() push ebp mov ebp,esp push edi push esi push eax xor eax,eax mov [ebp+0FFF4],eax xor esi,esi mov edi,ds:[2534] test edi,edi jle short M00_L01 M00_L00: lea edx,ds:[5074] mov [ebp+0FFF4],edx mov edx,ds:[4FFC] mov ecx,offset MT_PerfLabTests.CastingPerf2.IFoo_5 call CORINFO_HELP_CHKCASTINTERFACE mov edx,[ebp+0FFF4] call CORINFO_HELP_CHECKED_ASSIGN_REF_EAX inc esi cmp esi,edi jl short M00_L00 M00_L01: pop ecx pop esi pop edi pop ebp ret ; Total bytes of code 66 ``` ### Compare Jit Disasm ```assembly ; PerfLabTests.CastingPerf2.CastingPerf.IFooObjIsIFooInterAlia() push ebp mov ebp,esp push edi push esi push eax xor eax,eax mov [ebp+0FFF4],eax xor esi,esi mov edi,ds:[254C] test edi,edi jle short M00_L01 M00_L00: lea edx,ds:[5074] mov [ebp+0FFF4],edx mov edx,ds:[4FFC] mov ecx,offset MT_PerfLabTests.CastingPerf2.IFoo_5 call CORINFO_HELP_CHKCASTINTERFACE mov edx,[ebp+0FFF4] call CORINFO_HELP_CHECKED_ASSIGN_REF_EAX inc esi cmp esi,edi jl short M00_L00 M00_L01: pop ecx pop esi pop edi pop ebp ret ; Total bytes of code 66 ``` ### 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 | [6ce5878104d61cbdbfa6eb5db959bfc63e1e8596](https://github.com/dotnet/runtime/commit/6ce5878104d61cbdbfa6eb5db959bfc63e1e8596) Compare | [027c093de1cc7d23a107e0594cebfb0216161dd4](https://github.com/dotnet/runtime/commit/027c093de1cc7d23a107e0594cebfb0216161dd4) ### Improvemnts in System.Collections.IterateForEachNonGeneric<Int32> Benchmark | Baseline | Test | Test/Base | Baseline IR | Compare IR | IR Ratio | Baseline ETL | Compare ETL -- | -- | -- | -- | -- | -- | -- | -- | -- [ArrayList]() | 3.38 μs | 2.82 μs | 0.83 | | | ![graph]() [Historical Data in Reporting System]() ### Repro ```cmd git clone https://github.com/dotnet/performance.git py .\performance\scripts\benchmarks_ci.py -f netcoreapp5.0 --filter 'System.Collections.IterateForEachNonGeneric<Int32>*' ```
. ### Payloads [Baseline]() [Compare]() ### Histogram #### System.Collections.IterateForEachNonGeneric.ArrayList(Size: 512) ```log [2786.744 ; 2854.517) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [2854.517 ; 2955.378) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [2955.378 ; 3046.255) | [3046.255 ; 3114.028) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [3114.028 ; 3199.768) | [3199.768 ; 3267.542) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@ [3267.542 ; 3354.918) | [3354.918 ; 3428.534) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ``` ### 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)