Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

default(object) takes more time than expected in net7.0 #2366

Closed
timcassell opened this issue Jul 11, 2023 · 8 comments · Fixed by #2374
Closed

default(object) takes more time than expected in net7.0 #2366

timcassell opened this issue Jul 11, 2023 · 8 comments · Fixed by #2374
Milestone

Comments

@timcassell
Copy link
Collaborator

This looks like a runtime issue to me, but @AndreyAkinshin asked me to open an issue here for it.

I observed simply adding a [GlobalSetup] to a benchmark class causes default(object) to take more time than without it. I only observed this in net7.0 and net8.0, no other runtime, and not with default primitives.

public class WithGlobalSetup
{
    [GlobalSetup] public void Setup() { }

    [Benchmark] public object DefaultClass() => default;
}

public class WithoutGlobalSetup
{
    [Benchmark] public object DefaultClass() => default;
}
Type Method Mean Error StdDev Median
WithGlobalSetup DefaultClass 0.8907 ns 0.1133 ns 0.2340 ns 0.8152 ns
WithoutGlobalSetup DefaultClass 0.0519 ns 0.0560 ns 0.0995 ns 0.0000 ns

OS is Windows 10 x64
CPU is AMD Phenom II X6 1055T @ 2.8 GHz

@timcassell
Copy link
Collaborator Author

Add [MemoryRandomization] to both classes.

Adding [MemoryRandomization] brought the result to a more expected value, but the individual iterations were very sporadic (~4 cycles difference between max and min)

Type Method Mean Error StdDev Median
WithGlobalSetup DefaultClass 0.1139 ns 0.0686 ns 0.1979 ns 0.0 ns
WithoutGlobalSetup DefaultClass 0.2354 ns 0.1322 ns 0.3899 ns 0.0 ns

Add different amounts of additional methods in the class with different signatures and method bodies (do not annotate them with attributes, just add additional methods to the target class).

Changing [GlobalSetup] to [GlobalCleanup] had no effect.

Removing [GlobalSetup] (still leaving the method, but un-attributed) brought the results more in line with expected.

Type Method Mean Error StdDev Median Code Size
WithGlobalSetup DefaultClass 0.0689 ns 0.0400 ns 0.1178 ns 0.0 ns 3 B
WithoutGlobalSetup DefaultClass 0.0266 ns 0.0435 ns 0.0651 ns 0.0 ns 3 B

Adding more un-attributed methods gave expected results.

Type Method Mean Error StdDev Median Code Size
ExtraMethods0 DefaultClass 0.1549 ns 0.0814 ns 0.1786 ns 0.0834 ns 3 B
ExtraMethods1 DefaultClass 0.0463 ns 0.0545 ns 0.1051 ns 0.0000 ns 3 B
ExtraMethods2 DefaultClass 0.0000 ns 0.0000 ns 0.0000 ns 0.0000 ns 3 B
ExtraMethods3 DefaultClass 0.0021 ns 0.0054 ns 0.0105 ns 0.0000 ns 3 B
ExtraMethods4 DefaultClass 0.0100 ns 0.0242 ns 0.0418 ns 0.0000 ns 3 B
ExtraMethods5 DefaultClass 0.0806 ns 0.0616 ns 0.1475 ns 0.0000 ns 3 B
ExtraMethods6 DefaultClass 0.0528 ns 0.0553 ns 0.1225 ns 0.0000 ns 3 B
ExtraMethods7 DefaultClass 0.0971 ns 0.0606 ns 0.1167 ns 0.0834 ns 3 B
ExtraMethods8 DefaultClass 0.0096 ns 0.0211 ns 0.0375 ns 0.0000 ns 3 B

Changing [GlobalSetup] to a random attribute gave expected results.

public class JustAnAttributeAttribute : Attribute { }
Type Method Mean Error StdDev Median Code Size
ExtraMethods0 DefaultClass 0.1527 ns 0.0768 ns 0.1854 ns 0.0822 ns 3 B
ExtraMethods1 DefaultClass 0.0454 ns 0.0431 ns 0.0831 ns 0.0000 ns 3 B
ExtraMethods2 DefaultClass 0.1311 ns 0.0733 ns 0.1826 ns 0.0425 ns 3 B

Increase the UnrollFactor to 32, 64, 128.

I'm not sure what conclusions can be gleaned from this.

Type Method UnrollFactor Mean Error StdDev Median Code Size
WithGlobalSetup DefaultClass 128 0.1825 ns 0.0833 ns 0.1963 ns 0.1205 ns 3 B
WithoutGlobalSetup DefaultClass 128 0.0000 ns 0.0000 ns 0.0000 ns 0.0000 ns 3 B
WithGlobalSetup DefaultClass 32 0.0275 ns 0.0322 ns 0.0837 ns 0.0000 ns 3 B
WithoutGlobalSetup DefaultClass 32 0.0000 ns 0.0000 ns 0.0000 ns 0.0000 ns 3 B
WithGlobalSetup DefaultClass 64 0.2379 ns 0.0885 ns 0.1502 ns 0.2275 ns 3 B
WithoutGlobalSetup DefaultClass 64 0.0000 ns 0.0000 ns 0.0000 ns 0.0000 ns 3 B
WithGlobalSetup DefaultClass 16 0.5273 ns 0.1212 ns 0.3554 ns 0.5343 ns 3 B
WithoutGlobalSetup DefaultClass 16 0.1955 ns 0.0743 ns 0.2070 ns 0.1333 ns 3 B

@timcassell
Copy link
Collaborator Author

Could you please share the actual memory addresses in disasm of the target benchmark methods and the starting addresses of the main benchmarking loops in the generated code?

@AndreyAkinshin How do I do that?

@adamsitnik
Copy link
Member

I suspect that it's related to code alignment and there is nothing we can do about it. Please see #2138 (comment)

@AndreyAkinshin
Copy link
Member

AndreyAkinshin commented Jul 17, 2023

@timcassell

How do I do that?

The easiest way is to open BenchmarkDotNet solution in Visual Studio, run the target benchmark, attach VS to the benchmarking process, put a breakpoint on the relevant line, and check out the disassembly view.

@timcassell
Copy link
Collaborator Author

The easiest way is to open BenchmarkDotNet solution in Visual Studio, run the target benchmark, attach VS to the benchmarking process, put a breakpoint on the relevant line, and check out the disassembly view.

That doesn't seem useful. I have to use a debug build to do that, and that changes the results.

@adamsitnik
Copy link
Member

You could also create a custom DisassemblyDiagnoserConfig with printInstructionAddresses: true and filters set to disassemble the desired method.

/// <param name="filters">Glob patterns applied to full method signatures by the the disassembler.</param>

@timcassell
Copy link
Collaborator Author

timcassell commented Jul 18, 2023

That got this result.

.NET 7.0.7 (7.0.723.27404), X64 RyuJIT SSE3

; Benchmarks.WithGlobalSetup.DefaultClass()
       7FF9CD18A120 xor       eax,eax
       7FF9CD18A122 ret
; Total bytes of code 3

.NET 7.0.7 (7.0.723.27404), X64 RyuJIT SSE3

; Benchmarks.WithoutGlobalSetup.DefaultClass()
       7FF9CD16A1E0 xor       eax,eax
       7FF9CD16A1E2 ret
; Total bytes of code 3

[Edit] With filters: new[] { "*Runnable_*.WorkloadActionUnroll*", "*DefaultClass*" }

net7.0 asm

.NET 7.0.7 (7.0.723.27404), X64 RyuJIT SSE3

; BenchmarkDotNet.Autogenerated.Runnable_0.WorkloadActionUnroll(Int64)
       7FFA490F8D40 push      rdi
       7FFA490F8D41 push      rsi
       7FFA490F8D42 push      rbp
       7FFA490F8D43 push      rbx
       7FFA490F8D44 sub       rsp,28
       7FFA490F8D48 mov       rsi,rcx
       7FFA490F8D4B mov       rdi,rdx
       7FFA490F8D4E xor       ebx,ebx
       7FFA490F8D50 test      rdi,rdi
       7FFA490F8D53 jle       near ptr M00_L01
M00_L00:
       7FFA490F8D59 mov       rbp,[rsi+38]
       7FFA490F8D5D mov       rax,[rsi+30]
       7FFA490F8D61 mov       rcx,[rax+8]
       7FFA490F8D65 call      qword ptr [rax+18]
       7FFA490F8D68 lea       rcx,[rbp+8]
       7FFA490F8D6C mov       rdx,rax
       7FFA490F8D6F call      CORINFO_HELP_ASSIGN_REF
       7FFA490F8D74 xor       ecx,ecx
       7FFA490F8D76 mov       [rbp+8],rcx
       7FFA490F8D7A mov       rbp,[rsi+38]
       7FFA490F8D7E mov       rax,[rsi+30]
       7FFA490F8D82 mov       rcx,[rax+8]
       7FFA490F8D86 call      qword ptr [rax+18]
       7FFA490F8D89 lea       rcx,[rbp+8]
       7FFA490F8D8D mov       rdx,rax
       7FFA490F8D90 call      CORINFO_HELP_ASSIGN_REF
       7FFA490F8D95 xor       ecx,ecx
       7FFA490F8D97 mov       [rbp+8],rcx
       7FFA490F8D9B mov       rbp,[rsi+38]
       7FFA490F8D9F mov       rax,[rsi+30]
       7FFA490F8DA3 mov       rcx,[rax+8]
       7FFA490F8DA7 call      qword ptr [rax+18]
       7FFA490F8DAA lea       rcx,[rbp+8]
       7FFA490F8DAE mov       rdx,rax
       7FFA490F8DB1 call      CORINFO_HELP_ASSIGN_REF
       7FFA490F8DB6 xor       ecx,ecx
       7FFA490F8DB8 mov       [rbp+8],rcx
       7FFA490F8DBC mov       rbp,[rsi+38]
       7FFA490F8DC0 mov       rax,[rsi+30]
       7FFA490F8DC4 mov       rcx,[rax+8]
       7FFA490F8DC8 call      qword ptr [rax+18]
       7FFA490F8DCB lea       rcx,[rbp+8]
       7FFA490F8DCF mov       rdx,rax
       7FFA490F8DD2 call      CORINFO_HELP_ASSIGN_REF
       7FFA490F8DD7 xor       ecx,ecx
       7FFA490F8DD9 mov       [rbp+8],rcx
       7FFA490F8DDD mov       rbp,[rsi+38]
       7FFA490F8DE1 mov       rax,[rsi+30]
       7FFA490F8DE5 mov       rcx,[rax+8]
       7FFA490F8DE9 call      qword ptr [rax+18]
       7FFA490F8DEC lea       rcx,[rbp+8]
       7FFA490F8DF0 mov       rdx,rax
       7FFA490F8DF3 call      CORINFO_HELP_ASSIGN_REF
       7FFA490F8DF8 xor       ecx,ecx
       7FFA490F8DFA mov       [rbp+8],rcx
       7FFA490F8DFE mov       rbp,[rsi+38]
       7FFA490F8E02 mov       rax,[rsi+30]
       7FFA490F8E06 mov       rcx,[rax+8]
       7FFA490F8E0A call      qword ptr [rax+18]
       7FFA490F8E0D lea       rcx,[rbp+8]
       7FFA490F8E11 mov       rdx,rax
       7FFA490F8E14 call      CORINFO_HELP_ASSIGN_REF
       7FFA490F8E19 xor       ecx,ecx
       7FFA490F8E1B mov       [rbp+8],rcx
       7FFA490F8E1F mov       rbp,[rsi+38]
       7FFA490F8E23 mov       rax,[rsi+30]
       7FFA490F8E27 mov       rcx,[rax+8]
       7FFA490F8E2B call      qword ptr [rax+18]
       7FFA490F8E2E lea       rcx,[rbp+8]
       7FFA490F8E32 mov       rdx,rax
       7FFA490F8E35 call      CORINFO_HELP_ASSIGN_REF
       7FFA490F8E3A xor       ecx,ecx
       7FFA490F8E3C mov       [rbp+8],rcx
       7FFA490F8E40 mov       rbp,[rsi+38]
       7FFA490F8E44 mov       rax,[rsi+30]
       7FFA490F8E48 mov       rcx,[rax+8]
       7FFA490F8E4C call      qword ptr [rax+18]
       7FFA490F8E4F lea       rcx,[rbp+8]
       7FFA490F8E53 mov       rdx,rax
       7FFA490F8E56 call      CORINFO_HELP_ASSIGN_REF
       7FFA490F8E5B xor       ecx,ecx
       7FFA490F8E5D mov       [rbp+8],rcx
       7FFA490F8E61 mov       rbp,[rsi+38]
       7FFA490F8E65 mov       rax,[rsi+30]
       7FFA490F8E69 mov       rcx,[rax+8]
       7FFA490F8E6D call      qword ptr [rax+18]
       7FFA490F8E70 lea       rcx,[rbp+8]
       7FFA490F8E74 mov       rdx,rax
       7FFA490F8E77 call      CORINFO_HELP_ASSIGN_REF
       7FFA490F8E7C xor       ecx,ecx
       7FFA490F8E7E mov       [rbp+8],rcx
       7FFA490F8E82 mov       rbp,[rsi+38]
       7FFA490F8E86 mov       rax,[rsi+30]
       7FFA490F8E8A mov       rcx,[rax+8]
       7FFA490F8E8E call      qword ptr [rax+18]
       7FFA490F8E91 lea       rcx,[rbp+8]
       7FFA490F8E95 mov       rdx,rax
       7FFA490F8E98 call      CORINFO_HELP_ASSIGN_REF
       7FFA490F8E9D xor       ecx,ecx
       7FFA490F8E9F mov       [rbp+8],rcx
       7FFA490F8EA3 mov       rbp,[rsi+38]
       7FFA490F8EA7 mov       rax,[rsi+30]
       7FFA490F8EAB mov       rcx,[rax+8]
       7FFA490F8EAF call      qword ptr [rax+18]
       7FFA490F8EB2 lea       rcx,[rbp+8]
       7FFA490F8EB6 mov       rdx,rax
       7FFA490F8EB9 call      CORINFO_HELP_ASSIGN_REF
       7FFA490F8EBE xor       ecx,ecx
       7FFA490F8EC0 mov       [rbp+8],rcx
       7FFA490F8EC4 mov       rbp,[rsi+38]
       7FFA490F8EC8 mov       rax,[rsi+30]
       7FFA490F8ECC mov       rcx,[rax+8]
       7FFA490F8ED0 call      qword ptr [rax+18]
       7FFA490F8ED3 lea       rcx,[rbp+8]
       7FFA490F8ED7 mov       rdx,rax
       7FFA490F8EDA call      CORINFO_HELP_ASSIGN_REF
       7FFA490F8EDF xor       ecx,ecx
       7FFA490F8EE1 mov       [rbp+8],rcx
       7FFA490F8EE5 mov       rbp,[rsi+38]
       7FFA490F8EE9 mov       rax,[rsi+30]
       7FFA490F8EED mov       rcx,[rax+8]
       7FFA490F8EF1 call      qword ptr [rax+18]
       7FFA490F8EF4 lea       rcx,[rbp+8]
       7FFA490F8EF8 mov       rdx,rax
       7FFA490F8EFB call      CORINFO_HELP_ASSIGN_REF
       7FFA490F8F00 xor       ecx,ecx
       7FFA490F8F02 mov       [rbp+8],rcx
       7FFA490F8F06 mov       rbp,[rsi+38]
       7FFA490F8F0A mov       rax,[rsi+30]
       7FFA490F8F0E mov       rcx,[rax+8]
       7FFA490F8F12 call      qword ptr [rax+18]
       7FFA490F8F15 lea       rcx,[rbp+8]
       7FFA490F8F19 mov       rdx,rax
       7FFA490F8F1C call      CORINFO_HELP_ASSIGN_REF
       7FFA490F8F21 xor       ecx,ecx
       7FFA490F8F23 mov       [rbp+8],rcx
       7FFA490F8F27 mov       rbp,[rsi+38]
       7FFA490F8F2B mov       rax,[rsi+30]
       7FFA490F8F2F mov       rcx,[rax+8]
       7FFA490F8F33 call      qword ptr [rax+18]
       7FFA490F8F36 lea       rcx,[rbp+8]
       7FFA490F8F3A mov       rdx,rax
       7FFA490F8F3D call      CORINFO_HELP_ASSIGN_REF
       7FFA490F8F42 xor       ecx,ecx
       7FFA490F8F44 mov       [rbp+8],rcx
       7FFA490F8F48 mov       rbp,[rsi+38]
       7FFA490F8F4C mov       rax,[rsi+30]
       7FFA490F8F50 mov       rcx,[rax+8]
       7FFA490F8F54 call      qword ptr [rax+18]
       7FFA490F8F57 lea       rcx,[rbp+8]
       7FFA490F8F5B mov       rdx,rax
       7FFA490F8F5E call      CORINFO_HELP_ASSIGN_REF
       7FFA490F8F63 xor       eax,eax
       7FFA490F8F65 mov       [rbp+8],rax
       7FFA490F8F69 inc       rbx
       7FFA490F8F6C cmp       rbx,rdi
       7FFA490F8F6F jl        near ptr M00_L00
M00_L01:
       7FFA490F8F75 add       rsp,28
       7FFA490F8F79 pop       rbx
       7FFA490F8F7A pop       rbp
       7FFA490F8F7B pop       rsi
       7FFA490F8F7C pop       rdi
       7FFA490F8F7D ret
; Total bytes of code 574
; Benchmarks.WithGlobalSetup.DefaultClass()
       7FFA490FA6C0 xor       eax,eax
       7FFA490FA6C2 ret
; Total bytes of code 3

.NET 7.0.7 (7.0.723.27404), X64 RyuJIT SSE3

; BenchmarkDotNet.Autogenerated.Runnable_1.WorkloadActionUnroll(Int64)
       7FFA490E8E00 push      rdi
       7FFA490E8E01 push      rsi
       7FFA490E8E02 push      rbp
       7FFA490E8E03 push      rbx
       7FFA490E8E04 sub       rsp,28
       7FFA490E8E08 mov       rsi,rcx
       7FFA490E8E0B mov       rdi,rdx
       7FFA490E8E0E xor       ebx,ebx
       7FFA490E8E10 test      rdi,rdi
       7FFA490E8E13 jle       near ptr M00_L01
M00_L00:
       7FFA490E8E19 mov       rbp,[rsi+38]
       7FFA490E8E1D mov       rax,[rsi+30]
       7FFA490E8E21 mov       rcx,[rax+8]
       7FFA490E8E25 call      qword ptr [rax+18]
       7FFA490E8E28 lea       rcx,[rbp+8]
       7FFA490E8E2C mov       rdx,rax
       7FFA490E8E2F call      CORINFO_HELP_ASSIGN_REF
       7FFA490E8E34 xor       ecx,ecx
       7FFA490E8E36 mov       [rbp+8],rcx
       7FFA490E8E3A mov       rbp,[rsi+38]
       7FFA490E8E3E mov       rax,[rsi+30]
       7FFA490E8E42 mov       rcx,[rax+8]
       7FFA490E8E46 call      qword ptr [rax+18]
       7FFA490E8E49 lea       rcx,[rbp+8]
       7FFA490E8E4D mov       rdx,rax
       7FFA490E8E50 call      CORINFO_HELP_ASSIGN_REF
       7FFA490E8E55 xor       ecx,ecx
       7FFA490E8E57 mov       [rbp+8],rcx
       7FFA490E8E5B mov       rbp,[rsi+38]
       7FFA490E8E5F mov       rax,[rsi+30]
       7FFA490E8E63 mov       rcx,[rax+8]
       7FFA490E8E67 call      qword ptr [rax+18]
       7FFA490E8E6A lea       rcx,[rbp+8]
       7FFA490E8E6E mov       rdx,rax
       7FFA490E8E71 call      CORINFO_HELP_ASSIGN_REF
       7FFA490E8E76 xor       ecx,ecx
       7FFA490E8E78 mov       [rbp+8],rcx
       7FFA490E8E7C mov       rbp,[rsi+38]
       7FFA490E8E80 mov       rax,[rsi+30]
       7FFA490E8E84 mov       rcx,[rax+8]
       7FFA490E8E88 call      qword ptr [rax+18]
       7FFA490E8E8B lea       rcx,[rbp+8]
       7FFA490E8E8F mov       rdx,rax
       7FFA490E8E92 call      CORINFO_HELP_ASSIGN_REF
       7FFA490E8E97 xor       ecx,ecx
       7FFA490E8E99 mov       [rbp+8],rcx
       7FFA490E8E9D mov       rbp,[rsi+38]
       7FFA490E8EA1 mov       rax,[rsi+30]
       7FFA490E8EA5 mov       rcx,[rax+8]
       7FFA490E8EA9 call      qword ptr [rax+18]
       7FFA490E8EAC lea       rcx,[rbp+8]
       7FFA490E8EB0 mov       rdx,rax
       7FFA490E8EB3 call      CORINFO_HELP_ASSIGN_REF
       7FFA490E8EB8 xor       ecx,ecx
       7FFA490E8EBA mov       [rbp+8],rcx
       7FFA490E8EBE mov       rbp,[rsi+38]
       7FFA490E8EC2 mov       rax,[rsi+30]
       7FFA490E8EC6 mov       rcx,[rax+8]
       7FFA490E8ECA call      qword ptr [rax+18]
       7FFA490E8ECD lea       rcx,[rbp+8]
       7FFA490E8ED1 mov       rdx,rax
       7FFA490E8ED4 call      CORINFO_HELP_ASSIGN_REF
       7FFA490E8ED9 xor       ecx,ecx
       7FFA490E8EDB mov       [rbp+8],rcx
       7FFA490E8EDF mov       rbp,[rsi+38]
       7FFA490E8EE3 mov       rax,[rsi+30]
       7FFA490E8EE7 mov       rcx,[rax+8]
       7FFA490E8EEB call      qword ptr [rax+18]
       7FFA490E8EEE lea       rcx,[rbp+8]
       7FFA490E8EF2 mov       rdx,rax
       7FFA490E8EF5 call      CORINFO_HELP_ASSIGN_REF
       7FFA490E8EFA xor       ecx,ecx
       7FFA490E8EFC mov       [rbp+8],rcx
       7FFA490E8F00 mov       rbp,[rsi+38]
       7FFA490E8F04 mov       rax,[rsi+30]
       7FFA490E8F08 mov       rcx,[rax+8]
       7FFA490E8F0C call      qword ptr [rax+18]
       7FFA490E8F0F lea       rcx,[rbp+8]
       7FFA490E8F13 mov       rdx,rax
       7FFA490E8F16 call      CORINFO_HELP_ASSIGN_REF
       7FFA490E8F1B xor       ecx,ecx
       7FFA490E8F1D mov       [rbp+8],rcx
       7FFA490E8F21 mov       rbp,[rsi+38]
       7FFA490E8F25 mov       rax,[rsi+30]
       7FFA490E8F29 mov       rcx,[rax+8]
       7FFA490E8F2D call      qword ptr [rax+18]
       7FFA490E8F30 lea       rcx,[rbp+8]
       7FFA490E8F34 mov       rdx,rax
       7FFA490E8F37 call      CORINFO_HELP_ASSIGN_REF
       7FFA490E8F3C xor       ecx,ecx
       7FFA490E8F3E mov       [rbp+8],rcx
       7FFA490E8F42 mov       rbp,[rsi+38]
       7FFA490E8F46 mov       rax,[rsi+30]
       7FFA490E8F4A mov       rcx,[rax+8]
       7FFA490E8F4E call      qword ptr [rax+18]
       7FFA490E8F51 lea       rcx,[rbp+8]
       7FFA490E8F55 mov       rdx,rax
       7FFA490E8F58 call      CORINFO_HELP_ASSIGN_REF
       7FFA490E8F5D xor       ecx,ecx
       7FFA490E8F5F mov       [rbp+8],rcx
       7FFA490E8F63 mov       rbp,[rsi+38]
       7FFA490E8F67 mov       rax,[rsi+30]
       7FFA490E8F6B mov       rcx,[rax+8]
       7FFA490E8F6F call      qword ptr [rax+18]
       7FFA490E8F72 lea       rcx,[rbp+8]
       7FFA490E8F76 mov       rdx,rax
       7FFA490E8F79 call      CORINFO_HELP_ASSIGN_REF
       7FFA490E8F7E xor       ecx,ecx
       7FFA490E8F80 mov       [rbp+8],rcx
       7FFA490E8F84 mov       rbp,[rsi+38]
       7FFA490E8F88 mov       rax,[rsi+30]
       7FFA490E8F8C mov       rcx,[rax+8]
       7FFA490E8F90 call      qword ptr [rax+18]
       7FFA490E8F93 lea       rcx,[rbp+8]
       7FFA490E8F97 mov       rdx,rax
       7FFA490E8F9A call      CORINFO_HELP_ASSIGN_REF
       7FFA490E8F9F xor       ecx,ecx
       7FFA490E8FA1 mov       [rbp+8],rcx
       7FFA490E8FA5 mov       rbp,[rsi+38]
       7FFA490E8FA9 mov       rax,[rsi+30]
       7FFA490E8FAD mov       rcx,[rax+8]
       7FFA490E8FB1 call      qword ptr [rax+18]
       7FFA490E8FB4 lea       rcx,[rbp+8]
       7FFA490E8FB8 mov       rdx,rax
       7FFA490E8FBB call      CORINFO_HELP_ASSIGN_REF
       7FFA490E8FC0 xor       ecx,ecx
       7FFA490E8FC2 mov       [rbp+8],rcx
       7FFA490E8FC6 mov       rbp,[rsi+38]
       7FFA490E8FCA mov       rax,[rsi+30]
       7FFA490E8FCE mov       rcx,[rax+8]
       7FFA490E8FD2 call      qword ptr [rax+18]
       7FFA490E8FD5 lea       rcx,[rbp+8]
       7FFA490E8FD9 mov       rdx,rax
       7FFA490E8FDC call      CORINFO_HELP_ASSIGN_REF
       7FFA490E8FE1 xor       ecx,ecx
       7FFA490E8FE3 mov       [rbp+8],rcx
       7FFA490E8FE7 mov       rbp,[rsi+38]
       7FFA490E8FEB mov       rax,[rsi+30]
       7FFA490E8FEF mov       rcx,[rax+8]
       7FFA490E8FF3 call      qword ptr [rax+18]
       7FFA490E8FF6 lea       rcx,[rbp+8]
       7FFA490E8FFA mov       rdx,rax
       7FFA490E8FFD call      CORINFO_HELP_ASSIGN_REF
       7FFA490E9002 xor       ecx,ecx
       7FFA490E9004 mov       [rbp+8],rcx
       7FFA490E9008 mov       rbp,[rsi+38]
       7FFA490E900C mov       rax,[rsi+30]
       7FFA490E9010 mov       rcx,[rax+8]
       7FFA490E9014 call      qword ptr [rax+18]
       7FFA490E9017 lea       rcx,[rbp+8]
       7FFA490E901B mov       rdx,rax
       7FFA490E901E call      CORINFO_HELP_ASSIGN_REF
       7FFA490E9023 xor       eax,eax
       7FFA490E9025 mov       [rbp+8],rax
       7FFA490E9029 inc       rbx
       7FFA490E902C cmp       rbx,rdi
       7FFA490E902F jl        near ptr M00_L00
M00_L01:
       7FFA490E9035 add       rsp,28
       7FFA490E9039 pop       rbx
       7FFA490E903A pop       rbp
       7FFA490E903B pop       rsi
       7FFA490E903C pop       rdi
       7FFA490E903D ret
; Total bytes of code 574
; Benchmarks.WithoutGlobalSetup.DefaultClass()
       7FFA490EA780 xor       eax,eax
       7FFA490EA782 ret
; Total bytes of code 3

[Edit2] net6.0 for comparison (it looks exactly the same to me)

net6.0 asm

.NET 6.0.16 (6.0.1623.17311), X64 RyuJIT SSE3

; BenchmarkDotNet.Autogenerated.Runnable_0.WorkloadActionUnroll(Int64)
       7FFA4E071C60 push      rdi
       7FFA4E071C61 push      rsi
       7FFA4E071C62 push      rbp
       7FFA4E071C63 push      rbx
       7FFA4E071C64 sub       rsp,28
       7FFA4E071C68 mov       rsi,rcx
       7FFA4E071C6B mov       rdi,rdx
       7FFA4E071C6E xor       ebx,ebx
       7FFA4E071C70 test      rdi,rdi
       7FFA4E071C73 jle       near ptr M00_L01
M00_L00:
       7FFA4E071C79 mov       rbp,[rsi+38]
       7FFA4E071C7D mov       rax,[rsi+30]
       7FFA4E071C81 mov       rcx,[rax+8]
       7FFA4E071C85 call      qword ptr [rax+18]
       7FFA4E071C88 lea       rcx,[rbp+8]
       7FFA4E071C8C mov       rdx,rax
       7FFA4E071C8F call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071C94 xor       ecx,ecx
       7FFA4E071C96 mov       [rbp+8],rcx
       7FFA4E071C9A mov       rbp,[rsi+38]
       7FFA4E071C9E mov       rax,[rsi+30]
       7FFA4E071CA2 mov       rcx,[rax+8]
       7FFA4E071CA6 call      qword ptr [rax+18]
       7FFA4E071CA9 lea       rcx,[rbp+8]
       7FFA4E071CAD mov       rdx,rax
       7FFA4E071CB0 call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071CB5 xor       ecx,ecx
       7FFA4E071CB7 mov       [rbp+8],rcx
       7FFA4E071CBB mov       rbp,[rsi+38]
       7FFA4E071CBF mov       rax,[rsi+30]
       7FFA4E071CC3 mov       rcx,[rax+8]
       7FFA4E071CC7 call      qword ptr [rax+18]
       7FFA4E071CCA lea       rcx,[rbp+8]
       7FFA4E071CCE mov       rdx,rax
       7FFA4E071CD1 call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071CD6 xor       ecx,ecx
       7FFA4E071CD8 mov       [rbp+8],rcx
       7FFA4E071CDC mov       rbp,[rsi+38]
       7FFA4E071CE0 mov       rax,[rsi+30]
       7FFA4E071CE4 mov       rcx,[rax+8]
       7FFA4E071CE8 call      qword ptr [rax+18]
       7FFA4E071CEB lea       rcx,[rbp+8]
       7FFA4E071CEF mov       rdx,rax
       7FFA4E071CF2 call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071CF7 xor       ecx,ecx
       7FFA4E071CF9 mov       [rbp+8],rcx
       7FFA4E071CFD mov       rbp,[rsi+38]
       7FFA4E071D01 mov       rax,[rsi+30]
       7FFA4E071D05 mov       rcx,[rax+8]
       7FFA4E071D09 call      qword ptr [rax+18]
       7FFA4E071D0C lea       rcx,[rbp+8]
       7FFA4E071D10 mov       rdx,rax
       7FFA4E071D13 call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071D18 xor       ecx,ecx
       7FFA4E071D1A mov       [rbp+8],rcx
       7FFA4E071D1E mov       rbp,[rsi+38]
       7FFA4E071D22 mov       rax,[rsi+30]
       7FFA4E071D26 mov       rcx,[rax+8]
       7FFA4E071D2A call      qword ptr [rax+18]
       7FFA4E071D2D lea       rcx,[rbp+8]
       7FFA4E071D31 mov       rdx,rax
       7FFA4E071D34 call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071D39 xor       ecx,ecx
       7FFA4E071D3B mov       [rbp+8],rcx
       7FFA4E071D3F mov       rbp,[rsi+38]
       7FFA4E071D43 mov       rax,[rsi+30]
       7FFA4E071D47 mov       rcx,[rax+8]
       7FFA4E071D4B call      qword ptr [rax+18]
       7FFA4E071D4E lea       rcx,[rbp+8]
       7FFA4E071D52 mov       rdx,rax
       7FFA4E071D55 call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071D5A xor       ecx,ecx
       7FFA4E071D5C mov       [rbp+8],rcx
       7FFA4E071D60 mov       rbp,[rsi+38]
       7FFA4E071D64 mov       rax,[rsi+30]
       7FFA4E071D68 mov       rcx,[rax+8]
       7FFA4E071D6C call      qword ptr [rax+18]
       7FFA4E071D6F lea       rcx,[rbp+8]
       7FFA4E071D73 mov       rdx,rax
       7FFA4E071D76 call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071D7B xor       ecx,ecx
       7FFA4E071D7D mov       [rbp+8],rcx
       7FFA4E071D81 mov       rbp,[rsi+38]
       7FFA4E071D85 mov       rax,[rsi+30]
       7FFA4E071D89 mov       rcx,[rax+8]
       7FFA4E071D8D call      qword ptr [rax+18]
       7FFA4E071D90 lea       rcx,[rbp+8]
       7FFA4E071D94 mov       rdx,rax
       7FFA4E071D97 call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071D9C xor       ecx,ecx
       7FFA4E071D9E mov       [rbp+8],rcx
       7FFA4E071DA2 mov       rbp,[rsi+38]
       7FFA4E071DA6 mov       rax,[rsi+30]
       7FFA4E071DAA mov       rcx,[rax+8]
       7FFA4E071DAE call      qword ptr [rax+18]
       7FFA4E071DB1 lea       rcx,[rbp+8]
       7FFA4E071DB5 mov       rdx,rax
       7FFA4E071DB8 call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071DBD xor       ecx,ecx
       7FFA4E071DBF mov       [rbp+8],rcx
       7FFA4E071DC3 mov       rbp,[rsi+38]
       7FFA4E071DC7 mov       rax,[rsi+30]
       7FFA4E071DCB mov       rcx,[rax+8]
       7FFA4E071DCF call      qword ptr [rax+18]
       7FFA4E071DD2 lea       rcx,[rbp+8]
       7FFA4E071DD6 mov       rdx,rax
       7FFA4E071DD9 call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071DDE xor       ecx,ecx
       7FFA4E071DE0 mov       [rbp+8],rcx
       7FFA4E071DE4 mov       rbp,[rsi+38]
       7FFA4E071DE8 mov       rax,[rsi+30]
       7FFA4E071DEC mov       rcx,[rax+8]
       7FFA4E071DF0 call      qword ptr [rax+18]
       7FFA4E071DF3 lea       rcx,[rbp+8]
       7FFA4E071DF7 mov       rdx,rax
       7FFA4E071DFA call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071DFF xor       ecx,ecx
       7FFA4E071E01 mov       [rbp+8],rcx
       7FFA4E071E05 mov       rbp,[rsi+38]
       7FFA4E071E09 mov       rax,[rsi+30]
       7FFA4E071E0D mov       rcx,[rax+8]
       7FFA4E071E11 call      qword ptr [rax+18]
       7FFA4E071E14 lea       rcx,[rbp+8]
       7FFA4E071E18 mov       rdx,rax
       7FFA4E071E1B call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071E20 xor       ecx,ecx
       7FFA4E071E22 mov       [rbp+8],rcx
       7FFA4E071E26 mov       rbp,[rsi+38]
       7FFA4E071E2A mov       rax,[rsi+30]
       7FFA4E071E2E mov       rcx,[rax+8]
       7FFA4E071E32 call      qword ptr [rax+18]
       7FFA4E071E35 lea       rcx,[rbp+8]
       7FFA4E071E39 mov       rdx,rax
       7FFA4E071E3C call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071E41 xor       ecx,ecx
       7FFA4E071E43 mov       [rbp+8],rcx
       7FFA4E071E47 mov       rbp,[rsi+38]
       7FFA4E071E4B mov       rax,[rsi+30]
       7FFA4E071E4F mov       rcx,[rax+8]
       7FFA4E071E53 call      qword ptr [rax+18]
       7FFA4E071E56 lea       rcx,[rbp+8]
       7FFA4E071E5A mov       rdx,rax
       7FFA4E071E5D call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071E62 xor       ecx,ecx
       7FFA4E071E64 mov       [rbp+8],rcx
       7FFA4E071E68 mov       rbp,[rsi+38]
       7FFA4E071E6C mov       rax,[rsi+30]
       7FFA4E071E70 mov       rcx,[rax+8]
       7FFA4E071E74 call      qword ptr [rax+18]
       7FFA4E071E77 lea       rcx,[rbp+8]
       7FFA4E071E7B mov       rdx,rax
       7FFA4E071E7E call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071E83 xor       eax,eax
       7FFA4E071E85 mov       [rbp+8],rax
       7FFA4E071E89 inc       rbx
       7FFA4E071E8C cmp       rbx,rdi
       7FFA4E071E8F jl        near ptr M00_L00
M00_L01:
       7FFA4E071E95 add       rsp,28
       7FFA4E071E99 pop       rbx
       7FFA4E071E9A pop       rbp
       7FFA4E071E9B pop       rsi
       7FFA4E071E9C pop       rdi
       7FFA4E071E9D ret
; Total bytes of code 574
; Benchmarks.WithGlobalSetup.DefaultClass()
       7FFA4E074400 xor       eax,eax
       7FFA4E074402 ret
; Total bytes of code 3

.NET 6.0.16 (6.0.1623.17311), X64 RyuJIT SSE3

; BenchmarkDotNet.Autogenerated.Runnable_1.WorkloadActionUnroll(Int64)
       7FFA4E071C60 push      rdi
       7FFA4E071C61 push      rsi
       7FFA4E071C62 push      rbp
       7FFA4E071C63 push      rbx
       7FFA4E071C64 sub       rsp,28
       7FFA4E071C68 mov       rsi,rcx
       7FFA4E071C6B mov       rdi,rdx
       7FFA4E071C6E xor       ebx,ebx
       7FFA4E071C70 test      rdi,rdi
       7FFA4E071C73 jle       near ptr M00_L01
M00_L00:
       7FFA4E071C79 mov       rbp,[rsi+38]
       7FFA4E071C7D mov       rax,[rsi+30]
       7FFA4E071C81 mov       rcx,[rax+8]
       7FFA4E071C85 call      qword ptr [rax+18]
       7FFA4E071C88 lea       rcx,[rbp+8]
       7FFA4E071C8C mov       rdx,rax
       7FFA4E071C8F call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071C94 xor       ecx,ecx
       7FFA4E071C96 mov       [rbp+8],rcx
       7FFA4E071C9A mov       rbp,[rsi+38]
       7FFA4E071C9E mov       rax,[rsi+30]
       7FFA4E071CA2 mov       rcx,[rax+8]
       7FFA4E071CA6 call      qword ptr [rax+18]
       7FFA4E071CA9 lea       rcx,[rbp+8]
       7FFA4E071CAD mov       rdx,rax
       7FFA4E071CB0 call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071CB5 xor       ecx,ecx
       7FFA4E071CB7 mov       [rbp+8],rcx
       7FFA4E071CBB mov       rbp,[rsi+38]
       7FFA4E071CBF mov       rax,[rsi+30]
       7FFA4E071CC3 mov       rcx,[rax+8]
       7FFA4E071CC7 call      qword ptr [rax+18]
       7FFA4E071CCA lea       rcx,[rbp+8]
       7FFA4E071CCE mov       rdx,rax
       7FFA4E071CD1 call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071CD6 xor       ecx,ecx
       7FFA4E071CD8 mov       [rbp+8],rcx
       7FFA4E071CDC mov       rbp,[rsi+38]
       7FFA4E071CE0 mov       rax,[rsi+30]
       7FFA4E071CE4 mov       rcx,[rax+8]
       7FFA4E071CE8 call      qword ptr [rax+18]
       7FFA4E071CEB lea       rcx,[rbp+8]
       7FFA4E071CEF mov       rdx,rax
       7FFA4E071CF2 call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071CF7 xor       ecx,ecx
       7FFA4E071CF9 mov       [rbp+8],rcx
       7FFA4E071CFD mov       rbp,[rsi+38]
       7FFA4E071D01 mov       rax,[rsi+30]
       7FFA4E071D05 mov       rcx,[rax+8]
       7FFA4E071D09 call      qword ptr [rax+18]
       7FFA4E071D0C lea       rcx,[rbp+8]
       7FFA4E071D10 mov       rdx,rax
       7FFA4E071D13 call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071D18 xor       ecx,ecx
       7FFA4E071D1A mov       [rbp+8],rcx
       7FFA4E071D1E mov       rbp,[rsi+38]
       7FFA4E071D22 mov       rax,[rsi+30]
       7FFA4E071D26 mov       rcx,[rax+8]
       7FFA4E071D2A call      qword ptr [rax+18]
       7FFA4E071D2D lea       rcx,[rbp+8]
       7FFA4E071D31 mov       rdx,rax
       7FFA4E071D34 call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071D39 xor       ecx,ecx
       7FFA4E071D3B mov       [rbp+8],rcx
       7FFA4E071D3F mov       rbp,[rsi+38]
       7FFA4E071D43 mov       rax,[rsi+30]
       7FFA4E071D47 mov       rcx,[rax+8]
       7FFA4E071D4B call      qword ptr [rax+18]
       7FFA4E071D4E lea       rcx,[rbp+8]
       7FFA4E071D52 mov       rdx,rax
       7FFA4E071D55 call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071D5A xor       ecx,ecx
       7FFA4E071D5C mov       [rbp+8],rcx
       7FFA4E071D60 mov       rbp,[rsi+38]
       7FFA4E071D64 mov       rax,[rsi+30]
       7FFA4E071D68 mov       rcx,[rax+8]
       7FFA4E071D6C call      qword ptr [rax+18]
       7FFA4E071D6F lea       rcx,[rbp+8]
       7FFA4E071D73 mov       rdx,rax
       7FFA4E071D76 call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071D7B xor       ecx,ecx
       7FFA4E071D7D mov       [rbp+8],rcx
       7FFA4E071D81 mov       rbp,[rsi+38]
       7FFA4E071D85 mov       rax,[rsi+30]
       7FFA4E071D89 mov       rcx,[rax+8]
       7FFA4E071D8D call      qword ptr [rax+18]
       7FFA4E071D90 lea       rcx,[rbp+8]
       7FFA4E071D94 mov       rdx,rax
       7FFA4E071D97 call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071D9C xor       ecx,ecx
       7FFA4E071D9E mov       [rbp+8],rcx
       7FFA4E071DA2 mov       rbp,[rsi+38]
       7FFA4E071DA6 mov       rax,[rsi+30]
       7FFA4E071DAA mov       rcx,[rax+8]
       7FFA4E071DAE call      qword ptr [rax+18]
       7FFA4E071DB1 lea       rcx,[rbp+8]
       7FFA4E071DB5 mov       rdx,rax
       7FFA4E071DB8 call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071DBD xor       ecx,ecx
       7FFA4E071DBF mov       [rbp+8],rcx
       7FFA4E071DC3 mov       rbp,[rsi+38]
       7FFA4E071DC7 mov       rax,[rsi+30]
       7FFA4E071DCB mov       rcx,[rax+8]
       7FFA4E071DCF call      qword ptr [rax+18]
       7FFA4E071DD2 lea       rcx,[rbp+8]
       7FFA4E071DD6 mov       rdx,rax
       7FFA4E071DD9 call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071DDE xor       ecx,ecx
       7FFA4E071DE0 mov       [rbp+8],rcx
       7FFA4E071DE4 mov       rbp,[rsi+38]
       7FFA4E071DE8 mov       rax,[rsi+30]
       7FFA4E071DEC mov       rcx,[rax+8]
       7FFA4E071DF0 call      qword ptr [rax+18]
       7FFA4E071DF3 lea       rcx,[rbp+8]
       7FFA4E071DF7 mov       rdx,rax
       7FFA4E071DFA call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071DFF xor       ecx,ecx
       7FFA4E071E01 mov       [rbp+8],rcx
       7FFA4E071E05 mov       rbp,[rsi+38]
       7FFA4E071E09 mov       rax,[rsi+30]
       7FFA4E071E0D mov       rcx,[rax+8]
       7FFA4E071E11 call      qword ptr [rax+18]
       7FFA4E071E14 lea       rcx,[rbp+8]
       7FFA4E071E18 mov       rdx,rax
       7FFA4E071E1B call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071E20 xor       ecx,ecx
       7FFA4E071E22 mov       [rbp+8],rcx
       7FFA4E071E26 mov       rbp,[rsi+38]
       7FFA4E071E2A mov       rax,[rsi+30]
       7FFA4E071E2E mov       rcx,[rax+8]
       7FFA4E071E32 call      qword ptr [rax+18]
       7FFA4E071E35 lea       rcx,[rbp+8]
       7FFA4E071E39 mov       rdx,rax
       7FFA4E071E3C call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071E41 xor       ecx,ecx
       7FFA4E071E43 mov       [rbp+8],rcx
       7FFA4E071E47 mov       rbp,[rsi+38]
       7FFA4E071E4B mov       rax,[rsi+30]
       7FFA4E071E4F mov       rcx,[rax+8]
       7FFA4E071E53 call      qword ptr [rax+18]
       7FFA4E071E56 lea       rcx,[rbp+8]
       7FFA4E071E5A mov       rdx,rax
       7FFA4E071E5D call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071E62 xor       ecx,ecx
       7FFA4E071E64 mov       [rbp+8],rcx
       7FFA4E071E68 mov       rbp,[rsi+38]
       7FFA4E071E6C mov       rax,[rsi+30]
       7FFA4E071E70 mov       rcx,[rax+8]
       7FFA4E071E74 call      qword ptr [rax+18]
       7FFA4E071E77 lea       rcx,[rbp+8]
       7FFA4E071E7B mov       rdx,rax
       7FFA4E071E7E call      CORINFO_HELP_ASSIGN_REF
       7FFA4E071E83 xor       eax,eax
       7FFA4E071E85 mov       [rbp+8],rax
       7FFA4E071E89 inc       rbx
       7FFA4E071E8C cmp       rbx,rdi
       7FFA4E071E8F jl        near ptr M00_L00
M00_L01:
       7FFA4E071E95 add       rsp,28
       7FFA4E071E99 pop       rbx
       7FFA4E071E9A pop       rbp
       7FFA4E071E9B pop       rsi
       7FFA4E071E9C pop       rdi
       7FFA4E071E9D ret
; Total bytes of code 574
; Benchmarks.WithoutGlobalSetup.DefaultClass()
       7FFA4E074400 xor       eax,eax
       7FFA4E074402 ret
; Total bytes of code 3

@timcassell
Copy link
Collaborator Author

I found the issue and sent a fix. #2374

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants