1


string.Equals with OrdinalIgnoreCase performance boost from .NET 7 to .NET 8




Date Added (UTC):

10 Apr 2024 @ 23:26

Date Updated (UTC):

10 Apr 2024 @ 23:26


.NET Version(s):

.NET 7 .NET 8

Tag(s):

#StringComparison #Strings


Added By:
Profile Image

Blog   
Ireland    
.NET Developer and tech lead from Ireland!

Benchmark Results:





Benchmark Code:



using System.Collections.Generic;
using System;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Columns;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Jobs;
using BenchmarkDotNet.Reports;
using BenchmarkDotNet.Environments;

namespace Benchmarks
{
    [Config(typeof(Config))]
    [HideColumns(Column.Job, Column.RatioSD, Column.AllocRatio)]
    [MemoryDiagnoser]
    public class StringCompareDotNet8Benchmarks
    {
        [Benchmark]
        [ArgumentsSource(nameof(TestData))]
        public bool EqualsIgnoreCase(string s1, string s2) =>
            s1.Equals(s2, StringComparison.OrdinalIgnoreCase);

        public static IEnumerable<object[]> TestData()
        {
            yield return new object[]
            {
                @"Hi!", // 3 chars (to make sure overhead is not big)
                @"HI!",
            };

            yield return new object[]
            {
                @"hello!!!", // 8 chars (switches to SIMD)
                @"HELLO!!!",
            };

            yield return new object[]
            {
                @"hello world", // 11 chars (1xV128 + trailing elements)
                @"HELLO WORLD",
            };

            yield return new object[]
            {
                @"C:\prj\runtime-main\src\coreclr\CMakeLists.txt", // 46 chars (5xV128 + trailing elements)
                @"C:\prj\runtime-main\src\CORECLR\CMakeLists.txt",
            };

            yield return new object[]
            {
                @"Good bug reports make it easier for maintainers to verify and root cause the underlying problem. The better a bug report, the faster the problem will be resolved. Ideally, a bug report should contain the following information:", // 226 chars
                @"GOOD bug reports make it easier for maintainers to verify and root cause the underlying problem. The better a bug report, the faster the problem will be resolved. Ideally, a bug report should contain the following information:",
            };
        }

        private class Config : ManualConfig
        {
            public Config()
            {
                //setting compilation configs explicitly to avoid confusion

                AddJob(Job.Default.WithId(".NET7")
                   .WithRuntime(CoreRuntime.Core70)
                   .WithBaseline(true)
                   .WithEnvironmentVariables(
                       new EnvironmentVariable("DOTNET_ReadyToRun", "0"), // Disable AOT
                       new EnvironmentVariable("DOTNET_TC_QuickJitForLoops", "1"), // Enable Quick Jit for loop
                       new EnvironmentVariable("DOTNET_TieredPGO", "1"))); // Turn on layered PGO

                AddJob(Job.Default.WithId(".NET8")
                    .WithRuntime(CoreRuntime.Core80)
                    .WithEnvironmentVariables(
                       new EnvironmentVariable("DOTNET_ReadyToRun", "0"), // Disable AOT
                       new EnvironmentVariable("DOTNET_TC_QuickJitForLoops", "1"), // Enable Quick Jit for loop
                       new EnvironmentVariable("DOTNET_TieredPGO", "1"))); // Turn on layered PGO

                SummaryStyle =
                    SummaryStyle.Default.WithRatioStyle(RatioStyle.Percentage);
            }
        }
    }
}

// .NET 7, .NET 8
public bool EqualsIgnoreCase(string s1, string s2)
{
    return s1.Equals(s2, StringComparison.OrdinalIgnoreCase);
}

// .NET 7
.assembly _
{
    .custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = (
        01 00 08 00 00 00 00 00
    )
    .custom instance void [System.Runtime]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = (
        01 00 01 00 54 02 16 57 72 61 70 4e 6f 6e 45 78
        63 65 70 74 69 6f 6e 54 68 72 6f 77 73 01
    )
    .custom instance void [System.Runtime]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [System.Runtime]System.Diagnostics.DebuggableAttribute/DebuggingModes) = (
        01 00 02 00 00 00 00 00
    )
    .permissionset reqmin = (
        2e 01 80 8a 53 79 73 74 65 6d 2e 53 65 63 75 72
        69 74 79 2e 50 65 72 6d 69 73 73 69 6f 6e 73 2e
        53 65 63 75 72 69 74 79 50 65 72 6d 69 73 73 69
        6f 6e 41 74 74 72 69 62 75 74 65 2c 20 53 79 73
        74 65 6d 2e 52 75 6e 74 69 6d 65 2c 20 56 65 72
        73 69 6f 6e 3d 37 2e 30 2e 30 2e 30 2c 20 43 75
        6c 74 75 72 65 3d 6e 65 75 74 72 61 6c 2c 20 50
        75 62 6c 69 63 4b 65 79 54 6f 6b 65 6e 3d 62 30
        33 66 35 66 37 66 31 31 64 35 30 61 33 61 15 01
        54 02 10 53 6b 69 70 56 65 72 69 66 69 63 61 74
        69 6f 6e 01
    )
    .hash algorithm 0x00008004 // SHA1
    .ver 0:0:0:0
}

.class private auto ansi '<Module>'
{
} // end of class <Module>

.class public auto ansi beforefieldinit Benchmarks.StringCompareDotNet8Benchmarks
    extends [System.Runtime]System.Object
{
    .custom instance void [BenchmarkDotNet]BenchmarkDotNet.Attributes.ConfigAttribute::.ctor(class [System.Runtime]System.Type) = (
        01 00 30 42 65 6e 63 68 6d 61 72 6b 73 2e 53 74
        72 69 6e 67 43 6f 6d 70 61 72 65 44 6f 74 4e 65
        74 38 42 65 6e 63 68 6d 61 72 6b 73 2b 43 6f 6e
        66 69 67 00 00
    )
    .custom instance void [BenchmarkDotNet]BenchmarkDotNet.Attributes.HideColumnsAttribute::.ctor(string[]) = (
        01 00 03 00 00 00 03 4a 6f 62 07 52 61 74 69 6f
        53 44 0b 41 6c 6c 6f 63 20 52 61 74 69 6f 00 00
    )
    .custom instance void [BenchmarkDotNet]BenchmarkDotNet.Attributes.MemoryDiagnoserAttribute::.ctor(bool) = (
        01 00 01 00 00
    )
    // Nested Types
    .class nested private auto ansi beforefieldinit Config
        extends [BenchmarkDotNet]BenchmarkDotNet.Configs.ManualConfig
    {
        // Methods
        .method public hidebysig specialname rtspecialname 
            instance void .ctor () cil managed 
        {
            // Method begins at RVA 0x20b8
            // Code size 242 (0xf2)
            .maxstack 10

            // sequence point: (line 68, col 13) to (line 68, col 28) in _
            IL_0000: ldarg.0
            IL_0001: call instance void [BenchmarkDotNet]BenchmarkDotNet.Configs.ManualConfig::.ctor()
            // sequence point: (line 72, col 17) to (line 78, col 75) in _
            IL_0006: ldarg.0
            IL_0007: ldc.i4.1
            IL_0008: newarr [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job
            IL_000d: dup
            IL_000e: ldc.i4.0
            IL_000f: ldsfld !0 class [BenchmarkDotNet]BenchmarkDotNet.Jobs.JobMode`1<class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job>::Default
            IL_0014: ldstr ".NET7"
            IL_0019: call class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job [BenchmarkDotNet]BenchmarkDotNet.Jobs.JobExtensions::WithId(class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job, string)
            IL_001e: ldsfld class [BenchmarkDotNet]BenchmarkDotNet.Environments.CoreRuntime [BenchmarkDotNet]BenchmarkDotNet.Environments.CoreRuntime::Core70
            IL_0023: call class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job [BenchmarkDotNet]BenchmarkDotNet.Jobs.JobExtensions::WithRuntime(class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job, class [BenchmarkDotNet]BenchmarkDotNet.Environments.Runtime)
            IL_0028: ldc.i4.1
            IL_0029: call class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job [BenchmarkDotNet]BenchmarkDotNet.Jobs.JobExtensions::WithBaseline(class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job, bool)
            IL_002e: ldc.i4.3
            IL_002f: newarr [BenchmarkDotNet]BenchmarkDotNet.Jobs.EnvironmentVariable
            IL_0034: dup
            IL_0035: ldc.i4.0
            IL_0036: ldstr "DOTNET_ReadyToRun"
            IL_003b: ldstr "0"
            IL_0040: newobj instance void [BenchmarkDotNet]BenchmarkDotNet.Jobs.EnvironmentVariable::.ctor(string, string)
            IL_0045: stelem.ref
            IL_0046: dup
            IL_0047: ldc.i4.1
            IL_0048: ldstr "DOTNET_TC_QuickJitForLoops"
            IL_004d: ldstr "1"
            IL_0052: newobj instance void [BenchmarkDotNet]BenchmarkDotNet.Jobs.EnvironmentVariable::.ctor(string, string)
            IL_0057: stelem.ref
            IL_0058: dup
            IL_0059: ldc.i4.2
            IL_005a: ldstr "DOTNET_TieredPGO"
            IL_005f: ldstr "1"
            IL_0064: newobj instance void [BenchmarkDotNet]BenchmarkDotNet.Jobs.EnvironmentVariable::.ctor(string, string)
            IL_0069: stelem.ref
            IL_006a: call class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job [BenchmarkDotNet]BenchmarkDotNet.Jobs.JobExtensions::WithEnvironmentVariables(class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job, class [BenchmarkDotNet]BenchmarkDotNet.Jobs.EnvironmentVariable[])
            IL_006f: stelem.ref
            IL_0070: call instance class [BenchmarkDotNet]BenchmarkDotNet.Configs.ManualConfig [BenchmarkDotNet]BenchmarkDotNet.Configs.ManualConfig::AddJob(class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job[])
            IL_0075: pop
            // sequence point: (line 80, col 17) to (line 85, col 75) in _
            IL_0076: ldarg.0
            IL_0077: ldc.i4.1
            IL_0078: newarr [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job
            IL_007d: dup
            IL_007e: ldc.i4.0
            IL_007f: ldsfld !0 class [BenchmarkDotNet]BenchmarkDotNet.Jobs.JobMode`1<class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job>::Default
            IL_0084: ldstr ".NET8"
            IL_0089: call class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job [BenchmarkDotNet]BenchmarkDotNet.Jobs.JobExtensions::WithId(class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job, string)
            IL_008e: ldsfld class [BenchmarkDotNet]BenchmarkDotNet.Environments.CoreRuntime [BenchmarkDotNet]BenchmarkDotNet.Environments.CoreRuntime::Core80
            IL_0093: call class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job [BenchmarkDotNet]BenchmarkDotNet.Jobs.JobExtensions::WithRuntime(class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job, class [BenchmarkDotNet]BenchmarkDotNet.Environments.Runtime)
            IL_0098: ldc.i4.3
            IL_0099: newarr [BenchmarkDotNet]BenchmarkDotNet.Jobs.EnvironmentVariable
            IL_009e: dup
            IL_009f: ldc.i4.0
            IL_00a0: ldstr "DOTNET_ReadyToRun"
            IL_00a5: ldstr "0"
            IL_00aa: newobj instance void [BenchmarkDotNet]BenchmarkDotNet.Jobs.EnvironmentVariable::.ctor(string, string)
            IL_00af: stelem.ref
            IL_00b0: dup
            IL_00b1: ldc.i4.1
            IL_00b2: ldstr "DOTNET_TC_QuickJitForLoops"
            IL_00b7: ldstr "1"
            IL_00bc: newobj instance void [BenchmarkDotNet]BenchmarkDotNet.Jobs.EnvironmentVariable::.ctor(string, string)
            IL_00c1: stelem.ref
            IL_00c2: dup
            IL_00c3: ldc.i4.2
            IL_00c4: ldstr "DOTNET_TieredPGO"
            IL_00c9: ldstr "1"
            IL_00ce: newobj instance void [BenchmarkDotNet]BenchmarkDotNet.Jobs.EnvironmentVariable::.ctor(string, string)
            IL_00d3: stelem.ref
            IL_00d4: call class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job [BenchmarkDotNet]BenchmarkDotNet.Jobs.JobExtensions::WithEnvironmentVariables(class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job, class [BenchmarkDotNet]BenchmarkDotNet.Jobs.EnvironmentVariable[])
            IL_00d9: stelem.ref
            IL_00da: call instance class [BenchmarkDotNet]BenchmarkDotNet.Configs.ManualConfig [BenchmarkDotNet]BenchmarkDotNet.Configs.ManualConfig::AddJob(class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job[])
            IL_00df: pop
            // sequence point: (line 87, col 17) to (line 88, col 80) in _
            IL_00e0: ldarg.0
            IL_00e1: ldsfld class [BenchmarkDotNet]BenchmarkDotNet.Reports.SummaryStyle [BenchmarkDotNet]BenchmarkDotNet.Reports.SummaryStyle::Default
            IL_00e6: ldc.i4.1
            IL_00e7: callvirt instance class [BenchmarkDotNet]BenchmarkDotNet.Reports.SummaryStyle [BenchmarkDotNet]BenchmarkDotNet.Reports.SummaryStyle::WithRatioStyle(valuetype [BenchmarkDotNet]BenchmarkDotNet.Columns.RatioStyle)
            IL_00ec: call instance void [BenchmarkDotNet]BenchmarkDotNet.Configs.ManualConfig::set_SummaryStyle(class [BenchmarkDotNet]BenchmarkDotNet.Reports.SummaryStyle)
            // sequence point: (line 89, col 13) to (line 89, col 14) in _
            IL_00f1: ret
        } // end of method Config::.ctor

    } // end of class Config

    .class nested private auto ansi sealed beforefieldinit '<TestData>d__1'
        extends [System.Runtime]System.Object
        implements .custom instance void System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8[]) = (
            01 00 03 00 00 00 00 00 01 00 00
        )
        class [System.Runtime]System.Collections.Generic.IEnumerable`1<object[]>,
                   [System.Runtime]System.Collections.IEnumerable,
                   .custom instance void System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8[]) = (
            01 00 03 00 00 00 00 00 01 00 00
        )
        class [System.Runtime]System.Collections.Generic.IEnumerator`1<object[]>,
                   [System.Runtime]System.Collections.IEnumerator,
                   [System.Runtime]System.IDisposable
    {
        .custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
            01 00 00 00
        )
        // Fields
        .field private int32 '<>1__state'
        .field private object[] '<>2__current'
        .custom instance void System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8) = (
            01 00 01 00 00
        )
        .field private int32 '<>l__initialThreadId'

        // Methods
        .method public hidebysig specialname rtspecialname 
            instance void .ctor (
                int32 '<>1__state'
            ) cil managed 
        {
            .custom instance void [System.Runtime]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
                01 00 00 00
            )
            // Method begins at RVA 0x21b6
            // Code size 25 (0x19)
            .maxstack 8

            IL_0000: ldarg.0
            IL_0001: call instance void [System.Runtime]System.Object::.ctor()
            IL_0006: ldarg.0
            IL_0007: ldarg.1
            IL_0008: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            IL_000d: ldarg.0
            IL_000e: call int32 [System.Runtime]System.Environment::get_CurrentManagedThreadId()
            IL_0013: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>l__initialThreadId'
            IL_0018: ret
        } // end of method '<TestData>d__1'::.ctor

        .method private final hidebysig newslot virtual 
            instance void System.IDisposable.Dispose () cil managed 
        {
            .custom instance void [System.Runtime]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
                01 00 00 00
            )
            .override method instance void [System.Runtime]System.IDisposable::Dispose()
            // Method begins at RVA 0x21d0
            // Code size 1 (0x1)
            .maxstack 8

            IL_0000: ret
        } // end of method '<TestData>d__1'::System.IDisposable.Dispose

        .method private final hidebysig newslot virtual 
            instance bool MoveNext () cil managed 
        {
            .override method instance bool [System.Runtime]System.Collections.IEnumerator::MoveNext()
            // Method begins at RVA 0x21d4
            // Code size 268 (0x10c)
            .maxstack 5
            .locals init (
                [0] int32
            )

            // sequence point: hidden
            IL_0000: ldarg.0
            IL_0001: ldfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            IL_0006: stloc.0
            IL_0007: ldloc.0
            IL_0008: switch (IL_0027, IL_0053, IL_007f, IL_00ab, IL_00d7, IL_0103)

            IL_0025: ldc.i4.0
            IL_0026: ret

            IL_0027: ldarg.0
            IL_0028: ldc.i4.m1
            IL_0029: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            // sequence point: (line 35, col 13) to (line 39, col 15) in _
            IL_002e: ldarg.0
            IL_002f: ldc.i4.2
            IL_0030: newarr [System.Runtime]System.Object
            IL_0035: dup
            IL_0036: ldc.i4.0
            IL_0037: ldstr "Hi!"
            IL_003c: stelem.ref
            IL_003d: dup
            IL_003e: ldc.i4.1
            IL_003f: ldstr "HI!"
            IL_0044: stelem.ref
            IL_0045: stfld object[] Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>2__current'
            IL_004a: ldarg.0
            IL_004b: ldc.i4.1
            IL_004c: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            IL_0051: ldc.i4.1
            IL_0052: ret

            // sequence point: hidden
            IL_0053: ldarg.0
            IL_0054: ldc.i4.m1
            IL_0055: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            // sequence point: (line 41, col 13) to (line 45, col 15) in _
            IL_005a: ldarg.0
            IL_005b: ldc.i4.2
            IL_005c: newarr [System.Runtime]System.Object
            IL_0061: dup
            IL_0062: ldc.i4.0
            IL_0063: ldstr "hello!!!"
            IL_0068: stelem.ref
            IL_0069: dup
            IL_006a: ldc.i4.1
            IL_006b: ldstr "HELLO!!!"
            IL_0070: stelem.ref
            IL_0071: stfld object[] Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>2__current'
            IL_0076: ldarg.0
            IL_0077: ldc.i4.2
            IL_0078: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            IL_007d: ldc.i4.1
            IL_007e: ret

            // sequence point: hidden
            IL_007f: ldarg.0
            IL_0080: ldc.i4.m1
            IL_0081: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            // sequence point: (line 47, col 13) to (line 51, col 15) in _
            IL_0086: ldarg.0
            IL_0087: ldc.i4.2
            IL_0088: newarr [System.Runtime]System.Object
            IL_008d: dup
            IL_008e: ldc.i4.0
            IL_008f: ldstr "hello world"
            IL_0094: stelem.ref
            IL_0095: dup
            IL_0096: ldc.i4.1
            IL_0097: ldstr "HELLO WORLD"
            IL_009c: stelem.ref
            IL_009d: stfld object[] Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>2__current'
            IL_00a2: ldarg.0
            IL_00a3: ldc.i4.3
            IL_00a4: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            IL_00a9: ldc.i4.1
            IL_00aa: ret

            // sequence point: hidden
            IL_00ab: ldarg.0
            IL_00ac: ldc.i4.m1
            IL_00ad: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            // sequence point: (line 53, col 13) to (line 57, col 15) in _
            IL_00b2: ldarg.0
            IL_00b3: ldc.i4.2
            IL_00b4: newarr [System.Runtime]System.Object
            IL_00b9: dup
            IL_00ba: ldc.i4.0
            IL_00bb: ldstr "C:\\prj\\runtime-main\\src\\coreclr\\CMakeLists.txt"
            IL_00c0: stelem.ref
            IL_00c1: dup
            IL_00c2: ldc.i4.1
            IL_00c3: ldstr "C:\\prj\\runtime-main\\src\\CORECLR\\CMakeLists.txt"
            IL_00c8: stelem.ref
            IL_00c9: stfld object[] Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>2__current'
            IL_00ce: ldarg.0
            IL_00cf: ldc.i4.4
            IL_00d0: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            IL_00d5: ldc.i4.1
            IL_00d6: ret

            // sequence point: hidden
            IL_00d7: ldarg.0
            IL_00d8: ldc.i4.m1
            IL_00d9: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            // sequence point: (line 59, col 13) to (line 63, col 15) in _
            IL_00de: ldarg.0
            IL_00df: ldc.i4.2
            IL_00e0: newarr [System.Runtime]System.Object
            IL_00e5: dup
            IL_00e6: ldc.i4.0
            IL_00e7: ldstr "Good bug reports make it easier for maintainers to verify and root cause the underlying problem. The better a bug report, the faster the problem will be resolved. Ideally, a bug report should contain the following information:"
            IL_00ec: stelem.ref
            IL_00ed: dup
            IL_00ee: ldc.i4.1
            IL_00ef: ldstr "GOOD bug reports make it easier for maintainers to verify and root cause the underlying problem. The better a bug report, the faster the problem will be resolved. Ideally, a bug report should contain the following information:"
            IL_00f4: stelem.ref
            IL_00f5: stfld object[] Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>2__current'
            IL_00fa: ldarg.0
            IL_00fb: ldc.i4.5
            IL_00fc: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            IL_0101: ldc.i4.1
            IL_0102: ret

            // sequence point: hidden
            IL_0103: ldarg.0
            IL_0104: ldc.i4.m1
            IL_0105: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            // sequence point: (line 64, col 9) to (line 64, col 10) in _
            IL_010a: ldc.i4.0
            IL_010b: ret
        } // end of method '<TestData>d__1'::MoveNext

        .method private final hidebysig specialname newslot virtual 
            instance object[] 'System.Collections.Generic.IEnumerator<System.Object[]>.get_Current' () cil managed 
        {
            .custom instance void [System.Runtime]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
                01 00 00 00
            )
            .override method instance !0 class [System.Runtime]System.Collections.Generic.IEnumerator`1<object[]>::get_Current()
            .param [0]
                .custom instance void System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8) = (
                    01 00 01 00 00
                )
            // Method begins at RVA 0x22ec
            // Code size 7 (0x7)
            .maxstack 8

            IL_0000: ldarg.0
            IL_0001: ldfld object[] Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>2__current'
            IL_0006: ret
        } // end of method '<TestData>d__1'::'System.Collections.Generic.IEnumerator<System.Object[]>.get_Current'

        .method private final hidebysig newslot virtual 
            instance void System.Collections.IEnumerator.Reset () cil managed 
        {
            .custom instance void [System.Runtime]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
                01 00 00 00
            )
            .override method instance void [System.Runtime]System.Collections.IEnumerator::Reset()
            // Method begins at RVA 0x22f4
            // Code size 6 (0x6)
            .maxstack 8

            IL_0000: newobj instance void [System.Runtime]System.NotSupportedException::.ctor()
            IL_0005: throw
        } // end of method '<TestData>d__1'::System.Collections.IEnumerator.Reset

        .method private final hidebysig specialname newslot virtual 
            instance object System.Collections.IEnumerator.get_Current () cil managed 
        {
            .custom instance void [System.Runtime]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
                01 00 00 00
            )
            .override method instance object [System.Runtime]System.Collections.IEnumerator::get_Current()
            // Method begins at RVA 0x22ec
            // Code size 7 (0x7)
            .maxstack 8

            IL_0000: ldarg.0
            IL_0001: ldfld object[] Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>2__current'
            IL_0006: ret
        } // end of method '<TestData>d__1'::System.Collections.IEnumerator.get_Current

        .method private final hidebysig newslot virtual 
            instance class [System.Runtime]System.Collections.Generic.IEnumerator`1<object[]> 'System.Collections.Generic.IEnumerable<System.Object[]>.GetEnumerator' () cil managed 
        {
            .custom instance void [System.Runtime]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
                01 00 00 00
            )
            .override method instance class [System.Runtime]System.Collections.Generic.IEnumerator`1<!0> class [System.Runtime]System.Collections.Generic.IEnumerable`1<object[]>::GetEnumerator()
            .param [0]
                .custom instance void System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8[]) = (
                    01 00 03 00 00 00 01 00 01 00 00
                )
            // Method begins at RVA 0x22fc
            // Code size 43 (0x2b)
            .maxstack 2
            .locals init (
                [0] class Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'
            )

            IL_0000: ldarg.0
            IL_0001: ldfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            IL_0006: ldc.i4.s -2
            IL_0008: bne.un.s IL_0022

            IL_000a: ldarg.0
            IL_000b: ldfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>l__initialThreadId'
            IL_0010: call int32 [System.Runtime]System.Environment::get_CurrentManagedThreadId()
            IL_0015: bne.un.s IL_0022

            IL_0017: ldarg.0
            IL_0018: ldc.i4.0
            IL_0019: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            IL_001e: ldarg.0
            IL_001f: stloc.0
            IL_0020: br.s IL_0029

            IL_0022: ldc.i4.0
            IL_0023: newobj instance void Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::.ctor(int32)
            IL_0028: stloc.0

            IL_0029: ldloc.0
            IL_002a: ret
        } // end of method '<TestData>d__1'::'System.Collections.Generic.IEnumerable<System.Object[]>.GetEnumerator'

        .method private final hidebysig newslot virtual 
            instance class [System.Runtime]System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () cil managed 
        {
            .custom instance void [System.Runtime]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
                01 00 00 00
            )
            .override method instance class [System.Runtime]System.Collections.IEnumerator [System.Runtime]System.Collections.IEnumerable::GetEnumerator()
            .param [0]
                .custom instance void System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8) = (
                    01 00 01 00 00
                )
            // Method begins at RVA 0x2333
            // Code size 7 (0x7)
            .maxstack 8

            IL_0000: ldarg.0
            IL_0001: call instance class [System.Runtime]System.Collections.Generic.IEnumerator`1<object[]> Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'System.Collections.Generic.IEnumerable<System.Object[]>.GetEnumerator'()
            IL_0006: ret
        } // end of method '<TestData>d__1'::System.Collections.IEnumerable.GetEnumerator

        // Properties
        .property instance object[] 'System.Collections.Generic.IEnumerator<System.Object[]>.Current'()
        {
            .get instance object[] Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'System.Collections.Generic.IEnumerator<System.Object[]>.get_Current'()
        }
        .property instance object System.Collections.IEnumerator.Current()
        {
            .get instance object Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::System.Collections.IEnumerator.get_Current()
        }

    } // end of class <TestData>d__1


    // Methods
    .method public hidebysig 
        instance bool EqualsIgnoreCase (
            string s1,
            string s2
        ) cil managed 
    {
        .custom instance void System.Runtime.CompilerServices.NullableContextAttribute::.ctor(uint8) = (
            01 00 01 00 00
        )
        .custom instance void [BenchmarkDotNet.Annotations]BenchmarkDotNet.Attributes.BenchmarkAttribute::.ctor(int32, string) = (
            01 00 1c 00 00 00 01 5f 00 00
        )
        .custom instance void [BenchmarkDotNet.Annotations]BenchmarkDotNet.Attributes.ArgumentsSourceAttribute::.ctor(string) = (
            01 00 08 54 65 73 74 44 61 74 61 00 00
        )
        // Method begins at RVA 0x209d
        // Code size 9 (0x9)
        .maxstack 8

        // sequence point: (line 31, col 13) to (line 31, col 62) in _
        IL_0000: ldarg.1
        IL_0001: ldarg.2
        IL_0002: ldc.i4.5
        IL_0003: callvirt instance bool [System.Runtime]System.String::Equals(string, valuetype [System.Runtime]System.StringComparison)
        IL_0008: ret
    } // end of method StringCompareDotNet8Benchmarks::EqualsIgnoreCase

    .method public hidebysig static 
        class [System.Runtime]System.Collections.Generic.IEnumerable`1<object[]> TestData () cil managed 
    {
        .custom instance void System.Runtime.CompilerServices.NullableContextAttribute::.ctor(uint8) = (
            01 00 01 00 00
        )
        .custom instance void [System.Runtime]System.Runtime.CompilerServices.IteratorStateMachineAttribute::.ctor(class [System.Runtime]System.Type) = (
            01 00 38 42 65 6e 63 68 6d 61 72 6b 73 2e 53 74
            72 69 6e 67 43 6f 6d 70 61 72 65 44 6f 74 4e 65
            74 38 42 65 6e 63 68 6d 61 72 6b 73 2b 3c 54 65
            73 74 44 61 74 61 3e 64 5f 5f 31 00 00
        )
        // Method begins at RVA 0x20a7
        // Code size 8 (0x8)
        .maxstack 8

        IL_0000: ldc.i4.s -2
        IL_0002: newobj instance void Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::.ctor(int32)
        IL_0007: ret
    } // end of method StringCompareDotNet8Benchmarks::TestData

    .method public hidebysig specialname rtspecialname 
        instance void .ctor () cil managed 
    {
        // Method begins at RVA 0x20b0
        // Code size 7 (0x7)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: call instance void [System.Runtime]System.Object::.ctor()
        IL_0006: ret
    } // end of method StringCompareDotNet8Benchmarks::.ctor

} // end of class Benchmarks.StringCompareDotNet8Benchmarks

.class private auto ansi sealed beforefieldinit Microsoft.CodeAnalysis.EmbeddedAttribute
    extends [System.Runtime]System.Attribute
{
    .custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
        01 00 00 00
    )
    .custom instance void Microsoft.CodeAnalysis.EmbeddedAttribute::.ctor() = (
        01 00 00 00
    )
    // Methods
    .method public hidebysig specialname rtspecialname 
        instance void .ctor () cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 7 (0x7)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: call instance void [System.Runtime]System.Attribute::.ctor()
        IL_0006: ret
    } // end of method EmbeddedAttribute::.ctor

} // end of class Microsoft.CodeAnalysis.EmbeddedAttribute

.class private auto ansi sealed beforefieldinit System.Runtime.CompilerServices.NullableAttribute
    extends [System.Runtime]System.Attribute
{
    .custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
        01 00 00 00
    )
    .custom instance void Microsoft.CodeAnalysis.EmbeddedAttribute::.ctor() = (
        01 00 00 00
    )
    .custom instance void [System.Runtime]System.AttributeUsageAttribute::.ctor(valuetype [System.Runtime]System.AttributeTargets) = (
        01 00 84 6b 00 00 02 00 54 02 0d 41 6c 6c 6f 77
        4d 75 6c 74 69 70 6c 65 00 54 02 09 49 6e 68 65
        72 69 74 65 64 00
    )
    // Fields
    .field public initonly uint8[] NullableFlags

    // Methods
    .method public hidebysig specialname rtspecialname 
        instance void .ctor (
            uint8 ''
        ) cil managed 
    {
        // Method begins at RVA 0x2058
        // Code size 23 (0x17)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: call instance void [System.Runtime]System.Attribute::.ctor()
        IL_0006: ldarg.0
        IL_0007: ldc.i4.1
        IL_0008: newarr [System.Runtime]System.Byte
        IL_000d: dup
        IL_000e: ldc.i4.0
        IL_000f: ldarg.1
        IL_0010: stelem.i1
        IL_0011: stfld uint8[] System.Runtime.CompilerServices.NullableAttribute::NullableFlags
        IL_0016: ret
    } // end of method NullableAttribute::.ctor

    .method public hidebysig specialname rtspecialname 
        instance void .ctor (
            uint8[] ''
        ) cil managed 
    {
        // Method begins at RVA 0x2070
        // Code size 14 (0xe)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: call instance void [System.Runtime]System.Attribute::.ctor()
        IL_0006: ldarg.0
        IL_0007: ldarg.1
        IL_0008: stfld uint8[] System.Runtime.CompilerServices.NullableAttribute::NullableFlags
        IL_000d: ret
    } // end of method NullableAttribute::.ctor

} // end of class System.Runtime.CompilerServices.NullableAttribute

.class private auto ansi sealed beforefieldinit System.Runtime.CompilerServices.NullableContextAttribute
    extends [System.Runtime]System.Attribute
{
    .custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
        01 00 00 00
    )
    .custom instance void Microsoft.CodeAnalysis.EmbeddedAttribute::.ctor() = (
        01 00 00 00
    )
    .custom instance void [System.Runtime]System.AttributeUsageAttribute::.ctor(valuetype [System.Runtime]System.AttributeTargets) = (
        01 00 4c 14 00 00 02 00 54 02 0d 41 6c 6c 6f 77
        4d 75 6c 74 69 70 6c 65 00 54 02 09 49 6e 68 65
        72 69 74 65 64 00
    )
    // Fields
    .field public initonly uint8 Flag

    // Methods
    .method public hidebysig specialname rtspecialname 
        instance void .ctor (
            uint8 ''
        ) cil managed 
    {
        // Method begins at RVA 0x207f
        // Code size 14 (0xe)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: call instance void [System.Runtime]System.Attribute::.ctor()
        IL_0006: ldarg.0
        IL_0007: ldarg.1
        IL_0008: stfld uint8 System.Runtime.CompilerServices.NullableContextAttribute::Flag
        IL_000d: ret
    } // end of method NullableContextAttribute::.ctor

} // end of class System.Runtime.CompilerServices.NullableContextAttribute

.class private auto ansi sealed beforefieldinit System.Runtime.CompilerServices.RefSafetyRulesAttribute
    extends [System.Runtime]System.Attribute
{
    .custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
        01 00 00 00
    )
    .custom instance void Microsoft.CodeAnalysis.EmbeddedAttribute::.ctor() = (
        01 00 00 00
    )
    .custom instance void [System.Runtime]System.AttributeUsageAttribute::.ctor(valuetype [System.Runtime]System.AttributeTargets) = (
        01 00 02 00 00 00 02 00 54 02 0d 41 6c 6c 6f 77
        4d 75 6c 74 69 70 6c 65 00 54 02 09 49 6e 68 65
        72 69 74 65 64 00
    )
    // Fields
    .field public initonly int32 Version

    // Methods
    .method public hidebysig specialname rtspecialname 
        instance void .ctor (
            int32 ''
        ) cil managed 
    {
        // Method begins at RVA 0x208e
        // Code size 14 (0xe)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: call instance void [System.Runtime]System.Attribute::.ctor()
        IL_0006: ldarg.0
        IL_0007: ldarg.1
        IL_0008: stfld int32 System.Runtime.CompilerServices.RefSafetyRulesAttribute::Version
        IL_000d: ret
    } // end of method RefSafetyRulesAttribute::.ctor

} // end of class System.Runtime.CompilerServices.RefSafetyRulesAttribute



// .NET 8
.assembly _
{
    .custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = (
        01 00 08 00 00 00 00 00
    )
    .custom instance void [System.Runtime]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = (
        01 00 01 00 54 02 16 57 72 61 70 4e 6f 6e 45 78
        63 65 70 74 69 6f 6e 54 68 72 6f 77 73 01
    )
    .custom instance void [System.Runtime]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [System.Runtime]System.Diagnostics.DebuggableAttribute/DebuggingModes) = (
        01 00 02 00 00 00 00 00
    )
    .permissionset reqmin = (
        2e 01 80 8a 53 79 73 74 65 6d 2e 53 65 63 75 72
        69 74 79 2e 50 65 72 6d 69 73 73 69 6f 6e 73 2e
        53 65 63 75 72 69 74 79 50 65 72 6d 69 73 73 69
        6f 6e 41 74 74 72 69 62 75 74 65 2c 20 53 79 73
        74 65 6d 2e 52 75 6e 74 69 6d 65 2c 20 56 65 72
        73 69 6f 6e 3d 38 2e 30 2e 30 2e 30 2c 20 43 75
        6c 74 75 72 65 3d 6e 65 75 74 72 61 6c 2c 20 50
        75 62 6c 69 63 4b 65 79 54 6f 6b 65 6e 3d 62 30
        33 66 35 66 37 66 31 31 64 35 30 61 33 61 15 01
        54 02 10 53 6b 69 70 56 65 72 69 66 69 63 61 74
        69 6f 6e 01
    )
    .hash algorithm 0x00008004 // SHA1
    .ver 0:0:0:0
}

.class private auto ansi '<Module>'
{
} // end of class <Module>

.class public auto ansi beforefieldinit Benchmarks.StringCompareDotNet8Benchmarks
    extends [System.Runtime]System.Object
{
    .custom instance void [BenchmarkDotNet]BenchmarkDotNet.Attributes.ConfigAttribute::.ctor(class [System.Runtime]System.Type) = (
        01 00 30 42 65 6e 63 68 6d 61 72 6b 73 2e 53 74
        72 69 6e 67 43 6f 6d 70 61 72 65 44 6f 74 4e 65
        74 38 42 65 6e 63 68 6d 61 72 6b 73 2b 43 6f 6e
        66 69 67 00 00
    )
    .custom instance void [BenchmarkDotNet]BenchmarkDotNet.Attributes.HideColumnsAttribute::.ctor(string[]) = (
        01 00 03 00 00 00 03 4a 6f 62 07 52 61 74 69 6f
        53 44 0b 41 6c 6c 6f 63 20 52 61 74 69 6f 00 00
    )
    .custom instance void [BenchmarkDotNet]BenchmarkDotNet.Attributes.MemoryDiagnoserAttribute::.ctor(bool) = (
        01 00 01 00 00
    )
    // Nested Types
    .class nested private auto ansi beforefieldinit Config
        extends [BenchmarkDotNet]BenchmarkDotNet.Configs.ManualConfig
    {
        // Methods
        .method public hidebysig specialname rtspecialname 
            instance void .ctor () cil managed 
        {
            // Method begins at RVA 0x206c
            // Code size 242 (0xf2)
            .maxstack 10

            // sequence point: (line 68, col 13) to (line 68, col 28) in _
            IL_0000: ldarg.0
            IL_0001: call instance void [BenchmarkDotNet]BenchmarkDotNet.Configs.ManualConfig::.ctor()
            // sequence point: (line 72, col 17) to (line 78, col 75) in _
            IL_0006: ldarg.0
            IL_0007: ldc.i4.1
            IL_0008: newarr [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job
            IL_000d: dup
            IL_000e: ldc.i4.0
            IL_000f: ldsfld !0 class [BenchmarkDotNet]BenchmarkDotNet.Jobs.JobMode`1<class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job>::Default
            IL_0014: ldstr ".NET7"
            IL_0019: call class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job [BenchmarkDotNet]BenchmarkDotNet.Jobs.JobExtensions::WithId(class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job, string)
            IL_001e: ldsfld class [BenchmarkDotNet]BenchmarkDotNet.Environments.CoreRuntime [BenchmarkDotNet]BenchmarkDotNet.Environments.CoreRuntime::Core70
            IL_0023: call class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job [BenchmarkDotNet]BenchmarkDotNet.Jobs.JobExtensions::WithRuntime(class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job, class [BenchmarkDotNet]BenchmarkDotNet.Environments.Runtime)
            IL_0028: ldc.i4.1
            IL_0029: call class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job [BenchmarkDotNet]BenchmarkDotNet.Jobs.JobExtensions::WithBaseline(class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job, bool)
            IL_002e: ldc.i4.3
            IL_002f: newarr [BenchmarkDotNet]BenchmarkDotNet.Jobs.EnvironmentVariable
            IL_0034: dup
            IL_0035: ldc.i4.0
            IL_0036: ldstr "DOTNET_ReadyToRun"
            IL_003b: ldstr "0"
            IL_0040: newobj instance void [BenchmarkDotNet]BenchmarkDotNet.Jobs.EnvironmentVariable::.ctor(string, string)
            IL_0045: stelem.ref
            IL_0046: dup
            IL_0047: ldc.i4.1
            IL_0048: ldstr "DOTNET_TC_QuickJitForLoops"
            IL_004d: ldstr "1"
            IL_0052: newobj instance void [BenchmarkDotNet]BenchmarkDotNet.Jobs.EnvironmentVariable::.ctor(string, string)
            IL_0057: stelem.ref
            IL_0058: dup
            IL_0059: ldc.i4.2
            IL_005a: ldstr "DOTNET_TieredPGO"
            IL_005f: ldstr "1"
            IL_0064: newobj instance void [BenchmarkDotNet]BenchmarkDotNet.Jobs.EnvironmentVariable::.ctor(string, string)
            IL_0069: stelem.ref
            IL_006a: call class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job [BenchmarkDotNet]BenchmarkDotNet.Jobs.JobExtensions::WithEnvironmentVariables(class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job, class [BenchmarkDotNet]BenchmarkDotNet.Jobs.EnvironmentVariable[])
            IL_006f: stelem.ref
            IL_0070: call instance class [BenchmarkDotNet]BenchmarkDotNet.Configs.ManualConfig [BenchmarkDotNet]BenchmarkDotNet.Configs.ManualConfig::AddJob(class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job[])
            IL_0075: pop
            // sequence point: (line 80, col 17) to (line 85, col 75) in _
            IL_0076: ldarg.0
            IL_0077: ldc.i4.1
            IL_0078: newarr [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job
            IL_007d: dup
            IL_007e: ldc.i4.0
            IL_007f: ldsfld !0 class [BenchmarkDotNet]BenchmarkDotNet.Jobs.JobMode`1<class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job>::Default
            IL_0084: ldstr ".NET8"
            IL_0089: call class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job [BenchmarkDotNet]BenchmarkDotNet.Jobs.JobExtensions::WithId(class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job, string)
            IL_008e: ldsfld class [BenchmarkDotNet]BenchmarkDotNet.Environments.CoreRuntime [BenchmarkDotNet]BenchmarkDotNet.Environments.CoreRuntime::Core80
            IL_0093: call class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job [BenchmarkDotNet]BenchmarkDotNet.Jobs.JobExtensions::WithRuntime(class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job, class [BenchmarkDotNet]BenchmarkDotNet.Environments.Runtime)
            IL_0098: ldc.i4.3
            IL_0099: newarr [BenchmarkDotNet]BenchmarkDotNet.Jobs.EnvironmentVariable
            IL_009e: dup
            IL_009f: ldc.i4.0
            IL_00a0: ldstr "DOTNET_ReadyToRun"
            IL_00a5: ldstr "0"
            IL_00aa: newobj instance void [BenchmarkDotNet]BenchmarkDotNet.Jobs.EnvironmentVariable::.ctor(string, string)
            IL_00af: stelem.ref
            IL_00b0: dup
            IL_00b1: ldc.i4.1
            IL_00b2: ldstr "DOTNET_TC_QuickJitForLoops"
            IL_00b7: ldstr "1"
            IL_00bc: newobj instance void [BenchmarkDotNet]BenchmarkDotNet.Jobs.EnvironmentVariable::.ctor(string, string)
            IL_00c1: stelem.ref
            IL_00c2: dup
            IL_00c3: ldc.i4.2
            IL_00c4: ldstr "DOTNET_TieredPGO"
            IL_00c9: ldstr "1"
            IL_00ce: newobj instance void [BenchmarkDotNet]BenchmarkDotNet.Jobs.EnvironmentVariable::.ctor(string, string)
            IL_00d3: stelem.ref
            IL_00d4: call class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job [BenchmarkDotNet]BenchmarkDotNet.Jobs.JobExtensions::WithEnvironmentVariables(class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job, class [BenchmarkDotNet]BenchmarkDotNet.Jobs.EnvironmentVariable[])
            IL_00d9: stelem.ref
            IL_00da: call instance class [BenchmarkDotNet]BenchmarkDotNet.Configs.ManualConfig [BenchmarkDotNet]BenchmarkDotNet.Configs.ManualConfig::AddJob(class [BenchmarkDotNet]BenchmarkDotNet.Jobs.Job[])
            IL_00df: pop
            // sequence point: (line 87, col 17) to (line 88, col 80) in _
            IL_00e0: ldarg.0
            IL_00e1: ldsfld class [BenchmarkDotNet]BenchmarkDotNet.Reports.SummaryStyle [BenchmarkDotNet]BenchmarkDotNet.Reports.SummaryStyle::Default
            IL_00e6: ldc.i4.1
            IL_00e7: callvirt instance class [BenchmarkDotNet]BenchmarkDotNet.Reports.SummaryStyle [BenchmarkDotNet]BenchmarkDotNet.Reports.SummaryStyle::WithRatioStyle(valuetype [BenchmarkDotNet]BenchmarkDotNet.Columns.RatioStyle)
            IL_00ec: call instance void [BenchmarkDotNet]BenchmarkDotNet.Configs.ManualConfig::set_SummaryStyle(class [BenchmarkDotNet]BenchmarkDotNet.Reports.SummaryStyle)
            // sequence point: (line 89, col 13) to (line 89, col 14) in _
            IL_00f1: ret
        } // end of method Config::.ctor

    } // end of class Config

    .class nested private auto ansi sealed beforefieldinit '<TestData>d__1'
        extends [System.Runtime]System.Object
        implements .custom instance void [System.Runtime]System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8[]) = (
            01 00 03 00 00 00 00 00 01 00 00
        )
        class [System.Runtime]System.Collections.Generic.IEnumerable`1<object[]>,
                   [System.Runtime]System.Collections.IEnumerable,
                   .custom instance void [System.Runtime]System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8[]) = (
            01 00 03 00 00 00 00 00 01 00 00
        )
        class [System.Runtime]System.Collections.Generic.IEnumerator`1<object[]>,
                   [System.Runtime]System.Collections.IEnumerator,
                   [System.Runtime]System.IDisposable
    {
        .custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
            01 00 00 00
        )
        // Fields
        .field private int32 '<>1__state'
        .field private object[] '<>2__current'
        .custom instance void [System.Runtime]System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8) = (
            01 00 01 00 00
        )
        .field private int32 '<>l__initialThreadId'

        // Methods
        .method public hidebysig specialname rtspecialname 
            instance void .ctor (
                int32 '<>1__state'
            ) cil managed 
        {
            .custom instance void [System.Runtime]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
                01 00 00 00
            )
            // Method begins at RVA 0x216a
            // Code size 25 (0x19)
            .maxstack 8

            IL_0000: ldarg.0
            IL_0001: call instance void [System.Runtime]System.Object::.ctor()
            IL_0006: ldarg.0
            IL_0007: ldarg.1
            IL_0008: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            IL_000d: ldarg.0
            IL_000e: call int32 [System.Runtime]System.Environment::get_CurrentManagedThreadId()
            IL_0013: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>l__initialThreadId'
            IL_0018: ret
        } // end of method '<TestData>d__1'::.ctor

        .method private final hidebysig newslot virtual 
            instance void System.IDisposable.Dispose () cil managed 
        {
            .custom instance void [System.Runtime]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
                01 00 00 00
            )
            .override method instance void [System.Runtime]System.IDisposable::Dispose()
            // Method begins at RVA 0x2184
            // Code size 1 (0x1)
            .maxstack 8

            IL_0000: ret
        } // end of method '<TestData>d__1'::System.IDisposable.Dispose

        .method private final hidebysig newslot virtual 
            instance bool MoveNext () cil managed 
        {
            .override method instance bool [System.Runtime]System.Collections.IEnumerator::MoveNext()
            // Method begins at RVA 0x2188
            // Code size 268 (0x10c)
            .maxstack 5
            .locals init (
                [0] int32
            )

            // sequence point: hidden
            IL_0000: ldarg.0
            IL_0001: ldfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            IL_0006: stloc.0
            IL_0007: ldloc.0
            IL_0008: switch (IL_0027, IL_0053, IL_007f, IL_00ab, IL_00d7, IL_0103)

            IL_0025: ldc.i4.0
            IL_0026: ret

            IL_0027: ldarg.0
            IL_0028: ldc.i4.m1
            IL_0029: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            // sequence point: (line 35, col 13) to (line 39, col 15) in _
            IL_002e: ldarg.0
            IL_002f: ldc.i4.2
            IL_0030: newarr [System.Runtime]System.Object
            IL_0035: dup
            IL_0036: ldc.i4.0
            IL_0037: ldstr "Hi!"
            IL_003c: stelem.ref
            IL_003d: dup
            IL_003e: ldc.i4.1
            IL_003f: ldstr "HI!"
            IL_0044: stelem.ref
            IL_0045: stfld object[] Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>2__current'
            IL_004a: ldarg.0
            IL_004b: ldc.i4.1
            IL_004c: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            IL_0051: ldc.i4.1
            IL_0052: ret

            // sequence point: hidden
            IL_0053: ldarg.0
            IL_0054: ldc.i4.m1
            IL_0055: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            // sequence point: (line 41, col 13) to (line 45, col 15) in _
            IL_005a: ldarg.0
            IL_005b: ldc.i4.2
            IL_005c: newarr [System.Runtime]System.Object
            IL_0061: dup
            IL_0062: ldc.i4.0
            IL_0063: ldstr "hello!!!"
            IL_0068: stelem.ref
            IL_0069: dup
            IL_006a: ldc.i4.1
            IL_006b: ldstr "HELLO!!!"
            IL_0070: stelem.ref
            IL_0071: stfld object[] Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>2__current'
            IL_0076: ldarg.0
            IL_0077: ldc.i4.2
            IL_0078: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            IL_007d: ldc.i4.1
            IL_007e: ret

            // sequence point: hidden
            IL_007f: ldarg.0
            IL_0080: ldc.i4.m1
            IL_0081: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            // sequence point: (line 47, col 13) to (line 51, col 15) in _
            IL_0086: ldarg.0
            IL_0087: ldc.i4.2
            IL_0088: newarr [System.Runtime]System.Object
            IL_008d: dup
            IL_008e: ldc.i4.0
            IL_008f: ldstr "hello world"
            IL_0094: stelem.ref
            IL_0095: dup
            IL_0096: ldc.i4.1
            IL_0097: ldstr "HELLO WORLD"
            IL_009c: stelem.ref
            IL_009d: stfld object[] Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>2__current'
            IL_00a2: ldarg.0
            IL_00a3: ldc.i4.3
            IL_00a4: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            IL_00a9: ldc.i4.1
            IL_00aa: ret

            // sequence point: hidden
            IL_00ab: ldarg.0
            IL_00ac: ldc.i4.m1
            IL_00ad: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            // sequence point: (line 53, col 13) to (line 57, col 15) in _
            IL_00b2: ldarg.0
            IL_00b3: ldc.i4.2
            IL_00b4: newarr [System.Runtime]System.Object
            IL_00b9: dup
            IL_00ba: ldc.i4.0
            IL_00bb: ldstr "C:\\prj\\runtime-main\\src\\coreclr\\CMakeLists.txt"
            IL_00c0: stelem.ref
            IL_00c1: dup
            IL_00c2: ldc.i4.1
            IL_00c3: ldstr "C:\\prj\\runtime-main\\src\\CORECLR\\CMakeLists.txt"
            IL_00c8: stelem.ref
            IL_00c9: stfld object[] Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>2__current'
            IL_00ce: ldarg.0
            IL_00cf: ldc.i4.4
            IL_00d0: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            IL_00d5: ldc.i4.1
            IL_00d6: ret

            // sequence point: hidden
            IL_00d7: ldarg.0
            IL_00d8: ldc.i4.m1
            IL_00d9: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            // sequence point: (line 59, col 13) to (line 63, col 15) in _
            IL_00de: ldarg.0
            IL_00df: ldc.i4.2
            IL_00e0: newarr [System.Runtime]System.Object
            IL_00e5: dup
            IL_00e6: ldc.i4.0
            IL_00e7: ldstr "Good bug reports make it easier for maintainers to verify and root cause the underlying problem. The better a bug report, the faster the problem will be resolved. Ideally, a bug report should contain the following information:"
            IL_00ec: stelem.ref
            IL_00ed: dup
            IL_00ee: ldc.i4.1
            IL_00ef: ldstr "GOOD bug reports make it easier for maintainers to verify and root cause the underlying problem. The better a bug report, the faster the problem will be resolved. Ideally, a bug report should contain the following information:"
            IL_00f4: stelem.ref
            IL_00f5: stfld object[] Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>2__current'
            IL_00fa: ldarg.0
            IL_00fb: ldc.i4.5
            IL_00fc: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            IL_0101: ldc.i4.1
            IL_0102: ret

            // sequence point: hidden
            IL_0103: ldarg.0
            IL_0104: ldc.i4.m1
            IL_0105: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            // sequence point: (line 64, col 9) to (line 64, col 10) in _
            IL_010a: ldc.i4.0
            IL_010b: ret
        } // end of method '<TestData>d__1'::MoveNext

        .method private final hidebysig specialname newslot virtual 
            instance object[] 'System.Collections.Generic.IEnumerator<System.Object[]>.get_Current' () cil managed 
        {
            .custom instance void [System.Runtime]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
                01 00 00 00
            )
            .override method instance !0 class [System.Runtime]System.Collections.Generic.IEnumerator`1<object[]>::get_Current()
            .param [0]
                .custom instance void [System.Runtime]System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8) = (
                    01 00 01 00 00
                )
            // Method begins at RVA 0x22a0
            // Code size 7 (0x7)
            .maxstack 8

            IL_0000: ldarg.0
            IL_0001: ldfld object[] Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>2__current'
            IL_0006: ret
        } // end of method '<TestData>d__1'::'System.Collections.Generic.IEnumerator<System.Object[]>.get_Current'

        .method private final hidebysig newslot virtual 
            instance void System.Collections.IEnumerator.Reset () cil managed 
        {
            .custom instance void [System.Runtime]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
                01 00 00 00
            )
            .override method instance void [System.Runtime]System.Collections.IEnumerator::Reset()
            // Method begins at RVA 0x22a8
            // Code size 6 (0x6)
            .maxstack 8

            IL_0000: newobj instance void [System.Runtime]System.NotSupportedException::.ctor()
            IL_0005: throw
        } // end of method '<TestData>d__1'::System.Collections.IEnumerator.Reset

        .method private final hidebysig specialname newslot virtual 
            instance object System.Collections.IEnumerator.get_Current () cil managed 
        {
            .custom instance void [System.Runtime]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
                01 00 00 00
            )
            .override method instance object [System.Runtime]System.Collections.IEnumerator::get_Current()
            // Method begins at RVA 0x22a0
            // Code size 7 (0x7)
            .maxstack 8

            IL_0000: ldarg.0
            IL_0001: ldfld object[] Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>2__current'
            IL_0006: ret
        } // end of method '<TestData>d__1'::System.Collections.IEnumerator.get_Current

        .method private final hidebysig newslot virtual 
            instance class [System.Runtime]System.Collections.Generic.IEnumerator`1<object[]> 'System.Collections.Generic.IEnumerable<System.Object[]>.GetEnumerator' () cil managed 
        {
            .custom instance void [System.Runtime]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
                01 00 00 00
            )
            .override method instance class [System.Runtime]System.Collections.Generic.IEnumerator`1<!0> class [System.Runtime]System.Collections.Generic.IEnumerable`1<object[]>::GetEnumerator()
            .param [0]
                .custom instance void [System.Runtime]System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8[]) = (
                    01 00 03 00 00 00 01 00 01 00 00
                )
            // Method begins at RVA 0x22b0
            // Code size 43 (0x2b)
            .maxstack 2
            .locals init (
                [0] class Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'
            )

            IL_0000: ldarg.0
            IL_0001: ldfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            IL_0006: ldc.i4.s -2
            IL_0008: bne.un.s IL_0022

            IL_000a: ldarg.0
            IL_000b: ldfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>l__initialThreadId'
            IL_0010: call int32 [System.Runtime]System.Environment::get_CurrentManagedThreadId()
            IL_0015: bne.un.s IL_0022

            IL_0017: ldarg.0
            IL_0018: ldc.i4.0
            IL_0019: stfld int32 Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'<>1__state'
            IL_001e: ldarg.0
            IL_001f: stloc.0
            IL_0020: br.s IL_0029

            IL_0022: ldc.i4.0
            IL_0023: newobj instance void Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::.ctor(int32)
            IL_0028: stloc.0

            IL_0029: ldloc.0
            IL_002a: ret
        } // end of method '<TestData>d__1'::'System.Collections.Generic.IEnumerable<System.Object[]>.GetEnumerator'

        .method private final hidebysig newslot virtual 
            instance class [System.Runtime]System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () cil managed 
        {
            .custom instance void [System.Runtime]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
                01 00 00 00
            )
            .override method instance class [System.Runtime]System.Collections.IEnumerator [System.Runtime]System.Collections.IEnumerable::GetEnumerator()
            .param [0]
                .custom instance void [System.Runtime]System.Runtime.CompilerServices.NullableAttribute::.ctor(uint8) = (
                    01 00 01 00 00
                )
            // Method begins at RVA 0x22e7
            // Code size 7 (0x7)
            .maxstack 8

            IL_0000: ldarg.0
            IL_0001: call instance class [System.Runtime]System.Collections.Generic.IEnumerator`1<object[]> Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'System.Collections.Generic.IEnumerable<System.Object[]>.GetEnumerator'()
            IL_0006: ret
        } // end of method '<TestData>d__1'::System.Collections.IEnumerable.GetEnumerator

        // Properties
        .property instance object[] 'System.Collections.Generic.IEnumerator<System.Object[]>.Current'()
        {
            .get instance object[] Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::'System.Collections.Generic.IEnumerator<System.Object[]>.get_Current'()
        }
        .property instance object System.Collections.IEnumerator.Current()
        {
            .get instance object Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::System.Collections.IEnumerator.get_Current()
        }

    } // end of class <TestData>d__1


    // Methods
    .method public hidebysig 
        instance bool EqualsIgnoreCase (
            string s1,
            string s2
        ) cil managed 
    {
        .custom instance void [System.Runtime]System.Runtime.CompilerServices.NullableContextAttribute::.ctor(uint8) = (
            01 00 01 00 00
        )
        .custom instance void [BenchmarkDotNet.Annotations]BenchmarkDotNet.Attributes.BenchmarkAttribute::.ctor(int32, string) = (
            01 00 1c 00 00 00 01 5f 00 00
        )
        .custom instance void [BenchmarkDotNet.Annotations]BenchmarkDotNet.Attributes.ArgumentsSourceAttribute::.ctor(string) = (
            01 00 08 54 65 73 74 44 61 74 61 00 00
        )
        // Method begins at RVA 0x2050
        // Code size 9 (0x9)
        .maxstack 8

        // sequence point: (line 31, col 13) to (line 31, col 62) in _
        IL_0000: ldarg.1
        IL_0001: ldarg.2
        IL_0002: ldc.i4.5
        IL_0003: callvirt instance bool [System.Runtime]System.String::Equals(string, valuetype [System.Runtime]System.StringComparison)
        IL_0008: ret
    } // end of method StringCompareDotNet8Benchmarks::EqualsIgnoreCase

    .method public hidebysig static 
        class [System.Runtime]System.Collections.Generic.IEnumerable`1<object[]> TestData () cil managed 
    {
        .custom instance void [System.Runtime]System.Runtime.CompilerServices.NullableContextAttribute::.ctor(uint8) = (
            01 00 01 00 00
        )
        .custom instance void [System.Runtime]System.Runtime.CompilerServices.IteratorStateMachineAttribute::.ctor(class [System.Runtime]System.Type) = (
            01 00 38 42 65 6e 63 68 6d 61 72 6b 73 2e 53 74
            72 69 6e 67 43 6f 6d 70 61 72 65 44 6f 74 4e 65
            74 38 42 65 6e 63 68 6d 61 72 6b 73 2b 3c 54 65
            73 74 44 61 74 61 3e 64 5f 5f 31 00 00
        )
        // Method begins at RVA 0x205a
        // Code size 8 (0x8)
        .maxstack 8

        IL_0000: ldc.i4.s -2
        IL_0002: newobj instance void Benchmarks.StringCompareDotNet8Benchmarks/'<TestData>d__1'::.ctor(int32)
        IL_0007: ret
    } // end of method StringCompareDotNet8Benchmarks::TestData

    .method public hidebysig specialname rtspecialname 
        instance void .ctor () cil managed 
    {
        // Method begins at RVA 0x2063
        // Code size 7 (0x7)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: call instance void [System.Runtime]System.Object::.ctor()
        IL_0006: ret
    } // end of method StringCompareDotNet8Benchmarks::.ctor

} // end of class Benchmarks.StringCompareDotNet8Benchmarks

// .NET 7 (X64)
; Core CLR 7.0.1624.6629 on x64

Benchmarks.StringCompareDotNet8Benchmarks..ctor()
    L0000: ret

Benchmarks.StringCompareDotNet8Benchmarks.EqualsIgnoreCase(System.String, System.String)
    L0000: mov rcx, rdx
    L0003: mov rdx, r8
    L0006: mov r8d, 5
    L000c: cmp [rcx], ecx
    L000e: jmp qword ptr [0x7fff795d1348]

Benchmarks.StringCompareDotNet8Benchmarks.TestData()
    L0000: push rsi
    L0001: sub rsp, 0x20
    L0005: mov rcx, 0x7fff8028d9c8
    L000f: call 0x00007fffd903ec40
    L0014: mov rsi, rax
    L0017: mov dword ptr [rsi+0x10], 0xfffffffe
    L001e: call System.Environment.get_CurrentManagedThreadId()
    L0023: mov [rsi+0x14], eax
    L0026: mov rax, rsi
    L0029: add rsp, 0x20
    L002d: pop rsi
    L002e: ret

Benchmarks.StringCompareDotNet8Benchmarks+Config..ctor()
    L0000: push r15
    L0002: push r14
    L0004: push r13
    L0006: push r12
    L0008: push rdi
    L0009: push rsi
    L000a: push rbp
    L000b: push rbx
    L000c: sub rsp, 0x38
    L0010: mov rsi, rcx
    L0013: mov rcx, rsi
    L0016: call qword ptr [0x7fff7f831888]
    L001c: mov rcx, 0x7fff802a0380
    L0026: mov edx, 1
    L002b: call 0x00007fffd903edc0
    L0030: mov rdi, rax
    L0033: mov rcx, 0x7fff7f828a20
    L003d: xor edx, edx
    L003f: call 0x00007fffd9004d50
    L0044: mov rcx, 0x230f00734c0
    L004e: mov rbx, [rcx]
    L0051: mov rcx, 0x7fff8023fed0
    L005b: call 0x00007fffd903ec40
    L0060: mov rbp, rax
    L0063: mov rdx, 0x230f0091b78
    L006d: mov rdx, [rdx]
    L0070: mov rcx, rbp
    L0073: call qword ptr [0x7fff802493f0]
    L0079: mov rcx, rbp
    L007c: mov rdx, rbx
    L007f: call qword ptr [0x7fff80247cc0]
    L0085: mov r8, rax
    L0088: mov rdx, rbx
    L008b: mov rcx, rbp
    L008e: call qword ptr [0x7fff80247eb8]
    L0094: test rax, rax
    L0097: je short L00ac
    L0099: mov rcx, 0x7fff8023fed0
    L00a3: cmp [rax], rcx
    L00a6: jne L038c
    L00ac: mov rcx, 0x7fff7f828a20
    L00b6: mov edx, 0x1a8
    L00bb: call 0x00007fffd903ee10
    L00c0: mov rdx, 0x230f006de38
    L00ca: mov rdx, [rdx]
    L00cd: mov rcx, rbp
    L00d0: call qword ptr [0x7fff802495d0]
    L00d6: mov rcx, rax
    L00d9: mov edx, 1
    L00de: call qword ptr [0x7fff80249b10]
    L00e4: mov rbx, rax
    L00e7: mov rcx, 0x7fff802a1450
    L00f1: mov edx, 3
    L00f6: call 0x00007fffd903edc0
    L00fb: mov rbp, rax
    L00fe: mov r14, 0x7fff802a1338
    L0108: mov rcx, r14
    L010b: call 0x00007fffd903ec40
    L0110: mov r15, rax
    L0113: mov r8, 0x230f00046d0
    L011d: mov r12, [r8]
    L0120: mov r8, r12
    L0123: mov rdx, 0x230f0091b80
    L012d: mov r13, [rdx]
    L0130: mov rdx, r13
    L0133: mov rcx, r15
    L0136: call qword ptr [0x7fff80249db0]
    L013c: lea rcx, [rbp+0x10]
    L0140: mov rdx, r15
    L0143: call 0x00007fffd903e4b0
    L0148: mov rcx, r14
    L014b: call 0x00007fffd903ec40
    L0150: mov r15, rax
    L0153: mov r8, 0x230f0002208
    L015d: mov rax, [r8]
    L0160: mov [rsp+0x30], rax
    L0165: mov r8, rax
    L0168: mov rdx, 0x230f0091b88
    L0172: mov r9, [rdx]
    L0175: mov [rsp+0x28], r9
    L017a: mov rdx, r9
    L017d: mov rcx, r15
    L0180: call qword ptr [0x7fff80249db0]
    L0186: lea rcx, [rbp+0x18]
    L018a: mov rdx, r15
    L018d: call 0x00007fffd903e4b0
    L0192: mov rcx, r14
    L0195: call 0x00007fffd903ec40
    L019a: mov r15, rax
    L019d: mov r8, [rsp+0x30]
    L01a2: mov rdx, 0x230f0091b90
    L01ac: mov rax, [rdx]
    L01af: mov [rsp+0x20], rax
    L01b4: mov rdx, rax
    L01b7: mov rcx, r15
    L01ba: call qword ptr [0x7fff80249db0]
    L01c0: lea rcx, [rbp+0x20]
    L01c4: mov rdx, r15
    L01c7: call 0x00007fffd903e4b0
    L01cc: mov rcx, rbx
    L01cf: mov rdx, rbp
    L01d2: call qword ptr [0x7fff80249978]
    L01d8: lea rcx, [rdi+0x10]
    L01dc: mov rdx, rax
    L01df: call 0x00007fffd903e4b0
    L01e4: mov rcx, rsi
    L01e7: mov rdx, rdi
    L01ea: call qword ptr [0x7fff7f8316c0]
    L01f0: mov rcx, 0x7fff802a0380
    L01fa: mov edx, 1
    L01ff: call 0x00007fffd903edc0
    L0204: mov rdi, rax
    L0207: mov rcx, 0x230f00734c0
    L0211: mov rbx, [rcx]
    L0214: mov rcx, 0x7fff8023fed0
    L021e: call 0x00007fffd903ec40
    L0223: mov rbp, rax
    L0226: mov rdx, 0x230f0091b98
    L0230: mov rdx, [rdx]
    L0233: mov rcx, rbp
    L0236: call qword ptr [0x7fff802493f0]
    L023c: mov rcx, rbp
    L023f: mov rdx, rbx
    L0242: call qword ptr [0x7fff80247cc0]
    L0248: mov r8, rax
    L024b: mov rdx, rbx
    L024e: mov rcx, rbp
    L0251: call qword ptr [0x7fff80247eb8]
    L0257: test rax, rax
    L025a: je short L026f
    L025c: mov rcx, 0x7fff8023fed0
    L0266: cmp [rax], rcx
    L0269: jne L0396
    L026f: mov rdx, 0x230f006de40
    L0279: mov rdx, [rdx]
    L027c: mov rcx, rbp
    L027f: call qword ptr [0x7fff802495d0]
    L0285: mov rbx, rax
    L0288: mov rcx, 0x7fff802a1450
    L0292: mov edx, 3
    L0297: call 0x00007fffd903edc0
    L029c: mov rbp, rax
    L029f: mov rcx, r14
    L02a2: call 0x00007fffd903ec40
    L02a7: mov r15, rax
    L02aa: mov r8, r12
    L02ad: mov rdx, r13
    L02b0: mov rcx, r15
    L02b3: call qword ptr [0x7fff80249db0]
    L02b9: lea rcx, [rbp+0x10]
    L02bd: mov rdx, r15
    L02c0: call 0x00007fffd903e4b0
    L02c5: mov rcx, r14
    L02c8: call 0x00007fffd903ec40
    L02cd: mov r15, rax
    L02d0: mov r8, [rsp+0x30]
    L02d5: mov rdx, [rsp+0x28]
    L02da: mov rcx, r15
    L02dd: call qword ptr [0x7fff80249db0]
    L02e3: lea rcx, [rbp+0x18]
    L02e7: mov rdx, r15
    L02ea: call 0x00007fffd903e4b0
    L02ef: mov rcx, r14
    L02f2: call 0x00007fffd903ec40
    L02f7: mov r14, rax
    L02fa: mov r8, [rsp+0x30]
    L02ff: mov rdx, [rsp+0x20]
    L0304: mov rcx, r14
    L0307: call qword ptr [0x7fff80249db0]
    L030d: lea rcx, [rbp+0x20]
    L0311: mov rdx, r14
    L0314: call 0x00007fffd903e4b0
    L0319: mov rcx, rbx
    L031c: mov rdx, rbp
    L031f: call qword ptr [0x7fff80249978]
    L0325: lea rcx, [rdi+0x10]
    L0329: mov rdx, rax
    L032c: call 0x00007fffd903e4b0
    L0331: mov rcx, rsi
    L0334: mov rdx, rdi
    L0337: call qword ptr [0x7fff7f8316c0]
    L033d: mov rcx, 0x7fff7f828a20
    L0347: mov edx, 0xf7
    L034c: call 0x00007fffd903ee10
    L0351: mov rcx, 0x230f006d900
    L035b: mov rcx, [rcx]
    L035e: mov edx, 1
    L0363: cmp [rcx], ecx
    L0365: call qword ptr [0x7fff7f9a7978]
    L036b: lea rcx, [rsi+0x88]
    L0372: mov rdx, rax
    L0375: call 0x00007fffd903e4b0
    L037a: nop
    L037b: add rsp, 0x38
    L037f: pop rbx
    L0380: pop rbp
    L0381: pop rsi
    L0382: pop rdi
    L0383: pop r12
    L0385: pop r13
    L0387: pop r14
    L0389: pop r15
    L038b: ret
    L038c: mov rdx, rax
    L038f: call qword ptr [0x7fff7953b8b8]
    L0395: int3
    L0396: mov rdx, rax
    L0399: call qword ptr [0x7fff7953b8b8]
    L039f: int3

Benchmarks.StringCompareDotNet8Benchmarks+<TestData>d__1..ctor(Int32)
    L0000: push rsi
    L0001: sub rsp, 0x20
    L0005: mov rsi, rcx
    L0008: mov [rsi+0x10], edx
    L000b: call System.Environment.get_CurrentManagedThreadId()
    L0010: mov [rsi+0x14], eax
    L0013: add rsp, 0x20
    L0017: pop rsi
    L0018: ret

Benchmarks.StringCompareDotNet8Benchmarks+<TestData>d__1.System.IDisposable.Dispose()
    L0000: ret

Benchmarks.StringCompareDotNet8Benchmarks+<TestData>d__1.MoveNext()
    L0000: push rdi
    L0001: push rsi
    L0002: sub rsp, 0x28
    L0006: mov rsi, rcx
    L0009: mov ecx, [rsi+0x10]
    L000c: cmp ecx, 5
    L000f: ja L0222
    L0015: mov ecx, ecx
    L0017: lea rdx, [Benchmarks.StringCompareDotNet8Benchmarks+<TestData>d__1.MoveNext()]
    L001e: mov edx, [rdx+rcx*4]
    L0021: lea rax, [L0009]
    L0028: add rdx, rax
    L002b: jmp rdx
    L002d: mov dword ptr [rsi+0x10], 0xffffffff
    L0034: mov rcx, 0x7fff794aaa70
    L003e: mov edx, 2
    L0043: call 0x00007fffd903edc0
    L0048: mov rdi, rax
    L004b: lea rcx, [rdi+0x10]
    L004f: mov rdx, 0x230f0091ba0
    L0059: mov rdx, [rdx]
    L005c: call 0x00007fffd903e4b0
    L0061: lea rcx, [rdi+0x18]
    L0065: mov rdx, 0x230f0091ba8
    L006f: mov rdx, [rdx]
    L0072: call 0x00007fffd903e4b0
    L0077: lea rcx, [rsi+8]
    L007b: mov rdx, rdi
    L007e: call 0x00007fffd903e4b0
    L0083: mov dword ptr [rsi+0x10], 1
    L008a: jmp L020f
    L008f: mov dword ptr [rsi+0x10], 0xffffffff
    L0096: mov rcx, 0x7fff794aaa70
    L00a0: mov edx, 2
    L00a5: call 0x00007fffd903edc0
    L00aa: mov rdi, rax
    L00ad: lea rcx, [rdi+0x10]
    L00b1: mov rdx, 0x230f0091bb0
    L00bb: mov rdx, [rdx]
    L00be: call 0x00007fffd903e4b0
    L00c3: lea rcx, [rdi+0x18]
    L00c7: mov rdx, 0x230f0091bb8
    L00d1: mov rdx, [rdx]
    L00d4: call 0x00007fffd903e4b0
    L00d9: lea rcx, [rsi+8]
    L00dd: mov rdx, rdi
    L00e0: call 0x00007fffd903e4b0
    L00e5: mov dword ptr [rsi+0x10], 2
    L00ec: jmp L020f
    L00f1: mov dword ptr [rsi+0x10], 0xffffffff
    L00f8: mov rcx, 0x7fff794aaa70
    L0102: mov edx, 2
    L0107: call 0x00007fffd903edc0
    L010c: mov rdi, rax
    L010f: lea rcx, [rdi+0x10]
    L0113: mov rdx, 0x230f0091bc0
    L011d: mov rdx, [rdx]
    L0120: call 0x00007fffd903e4b0
    L0125: lea rcx, [rdi+0x18]
    L0129: mov rdx, 0x230f0091bc8
    L0133: mov rdx, [rdx]
    L0136: call 0x00007fffd903e4b0
    L013b: lea rcx, [rsi+8]
    L013f: mov rdx, rdi
    L0142: call 0x00007fffd903e4b0
    L0147: mov dword ptr [rsi+0x10], 3
    L014e: jmp L020f
    L0153: mov dword ptr [rsi+0x10], 0xffffffff
    L015a: mov rcx, 0x7fff794aaa70
    L0164: mov edx, 2
    L0169: call 0x00007fffd903edc0
    L016e: mov rdi, rax
    L0171: lea rcx, [rdi+0x10]
    L0175: mov rdx, 0x230f0091bd0
    L017f: mov rdx, [rdx]
    L0182: call 0x00007fffd903e4b0
    L0187: lea rcx, [rdi+0x18]
    L018b: mov rdx, 0x230f0091bd8
    L0195: mov rdx, [rdx]
    L0198: call 0x00007fffd903e4b0
    L019d: lea rcx, [rsi+8]
    L01a1: mov rdx, rdi
    L01a4: call 0x00007fffd903e4b0
    L01a9: mov dword ptr [rsi+0x10], 4
    L01b0: jmp short L020f
    L01b2: mov dword ptr [rsi+0x10], 0xffffffff
    L01b9: mov rcx, 0x7fff794aaa70
    L01c3: mov edx, 2
    L01c8: call 0x00007fffd903edc0
    L01cd: mov rdi, rax
    L01d0: lea rcx, [rdi+0x10]
    L01d4: mov rdx, 0x230f0091be0
    L01de: mov rdx, [rdx]
    L01e1: call 0x00007fffd903e4b0
    L01e6: lea rcx, [rdi+0x18]
    L01ea: mov rdx, 0x230f0091be8
    L01f4: mov rdx, [rdx]
    L01f7: call 0x00007fffd903e4b0
    L01fc: lea rcx, [rsi+8]
    L0200: mov rdx, rdi
    L0203: call 0x00007fffd903e4b0
    L0208: mov dword ptr [rsi+0x10], 5
    L020f: mov eax, 1
    L0214: add rsp, 0x28
    L0218: pop rsi
    L0219: pop rdi
    L021a: ret
    L021b: mov dword ptr [rsi+0x10], 0xffffffff
    L0222: xor eax, eax
    L0224: add rsp, 0x28
    L0228: pop rsi
    L0229: pop rdi
    L022a: ret

Benchmarks.StringCompareDotNet8Benchmarks+<TestData>d__1.System.Collections.Generic.IEnumerator<System.Object[]>.get_Current()
    L0000: mov rax, [rcx+8]
    L0004: ret

Benchmarks.StringCompareDotNet8Benchmarks+<TestData>d__1.System.Collections.IEnumerator.Reset()
    L0000: push rsi
    L0001: sub rsp, 0x20
    L0005: mov rcx, 0x7fff7968c7c0
    L000f: call 0x00007fffd903ec40
    L0014: mov rsi, rax
    L0017: mov rcx, rsi
    L001a: call qword ptr [0x7fff79691630]
    L0020: mov rcx, rsi
    L0023: call 0x00007fffd8eeea70
    L0028: int3

Benchmarks.StringCompareDotNet8Benchmarks+<TestData>d__1.System.Collections.IEnumerator.get_Current()
    L0000: mov rax, [rcx+8]
    L0004: ret

Benchmarks.StringCompareDotNet8Benchmarks+<TestData>d__1.System.Collections.Generic.IEnumerable<System.Object[]>.GetEnumerator()
    L0000: push rdi
    L0001: push rsi
    L0002: sub rsp, 0x28
    L0006: mov rsi, rcx
    L0009: cmp dword ptr [rsi+0x10], 0xfffffffe
    L000d: jne short L0022
    L000f: mov edi, [rsi+0x14]
    L0012: call System.Environment.get_CurrentManagedThreadId()
    L0017: cmp edi, eax
    L0019: jne short L0022
    L001b: xor ecx, ecx
    L001d: mov [rsi+0x10], ecx
    L0020: jmp short L0041
    L0022: mov rcx, 0x7fff8028d9c8
    L002c: call 0x00007fffd903ec40
    L0031: mov rsi, rax
    L0034: xor eax, eax
    L0036: mov [rsi+0x10], eax
    L0039: call System.Environment.get_CurrentManagedThreadId()
    L003e: mov [rsi+0x14], eax
    L0041: mov rax, rsi
    L0044: add rsp, 0x28
    L0048: pop rsi
    L0049: pop rdi
    L004a: ret

Benchmarks.StringCompareDotNet8Benchmarks+<TestData>d__1.System.Collections.IEnumerable.GetEnumerator()
    L0000: jmp Benchmarks.StringCompareDotNet8Benchmarks+<TestData>d__1.System.Collections.Generic.IEnumerable<System.Object[]>.GetEnumerator()

Microsoft.CodeAnalysis.EmbeddedAttribute..ctor()
    L0000: ret

System.Runtime.CompilerServices.NullableAttribute..ctor(Byte)
    L0000: push rdi
    L0001: push rsi
    L0002: sub rsp, 0x28
    L0006: mov rsi, rcx
    L0009: mov edi, edx
    L000b: mov rcx, 0x7fff796586f8
    L0015: mov edx, 1
    L001a: call 0x00007fffd903ed60
    L001f: mov [rax+0x10], dil
    L0023: lea rcx, [rsi+8]
    L0027: mov rdx, rax
    L002a: call 0x00007fffd903e4b0
    L002f: nop
    L0030: add rsp, 0x28
    L0034: pop rsi
    L0035: pop rdi
    L0036: ret

System.Runtime.CompilerServices.NullableAttribute..ctor(Byte[])
    L0000: lea rcx, [rcx+8]
    L0004: call 0x00007fffd903e4b0
    L0009: nop
    L000a: ret

System.Runtime.CompilerServices.NullableContextAttribute..ctor(Byte)
    L0000: mov [rcx+8], dl
    L0003: ret

System.Runtime.CompilerServices.RefSafetyRulesAttribute..ctor(Int32)
    L0000: mov [rcx+8], edx
    L0003: ret
// .NET 8 (X64)
; Core CLR 8.0.123.58001 on x64

Benchmarks.StringCompareDotNet8Benchmarks..ctor()
    L0000: ret

Benchmarks.StringCompareDotNet8Benchmarks.EqualsIgnoreCase(System.String, System.String)
    L0000: mov rcx, rdx
    L0003: mov rdx, r8
    L0006: mov r8d, 5
    L000c: cmp [rcx], ecx
    L000e: jmp qword ptr [0x7ffad10561a8]

Benchmarks.StringCompareDotNet8Benchmarks.TestData()
    L0000: push rbx
    L0001: sub rsp, 0x20
    L0005: mov rcx, 0x7ffad792d2c0
    L000f: call 0x00007ffb30beae10
    L0014: mov rbx, rax
    L0017: mov dword ptr [rbx+0x10], 0xfffffffe
    L001e: call System.Environment.get_CurrentManagedThreadId()
    L0023: mov [rbx+0x14], eax
    L0026: mov rax, rbx
    L0029: add rsp, 0x20
    L002d: pop rbx
    L002e: ret

Benchmarks.StringCompareDotNet8Benchmarks+Config..ctor()
    L0000: push r15
    L0002: push r14
    L0004: push r13
    L0006: push r12
    L0008: push rdi
    L0009: push rsi
    L000a: push rbp
    L000b: push rbx
    L000c: sub rsp, 0x38
    L0010: mov rbx, rcx
    L0013: mov rcx, rbx
    L0016: call qword ptr [0x7ffad78ddf50]
    L001c: mov rcx, 0x7ffad7a70018
    L0026: mov edx, 1
    L002b: call 0x00007ffb30beaf90
    L0030: mov rsi, rax
    L0033: mov rcx, 0x7ffad7936fa8
    L003d: xor edx, edx
    L003f: call 0x00007ffb30b9e880
    L0044: mov rcx, 0x1b5bf045b48
    L004e: mov rdi, [rcx]
    L0051: mov rcx, 0x7ffad7a4fd30
    L005b: call 0x00007ffb30beae10
    L0060: mov rbp, rax
    L0063: mov rdx, 0x1b5bf0654d8
    L006d: mov rdx, [rdx]
    L0070: mov rcx, rbp
    L0073: call qword ptr [0x7ffad7a64cf0]
    L0079: mov rcx, rdi
    L007c: cmp [rcx], ecx
    L007e: call qword ptr [0x7ffad7a64630]
    L0084: mov r8, rax
    L0087: mov rcx, rbp
    L008a: mov rdx, rdi
    L008d: call qword ptr [0x7ffad7a64840]
    L0093: test rax, rax
    L0096: je short L00ab
    L0098: mov rcx, 0x7ffad7a4fd30
    L00a2: cmp [rax], rcx
    L00a5: jne L0378
    L00ab: test byte ptr [0x7ffad793717b], 1
    L00b2: je L0382
    L00b8: mov rdx, 0x1b5bf044160
    L00c2: mov rdx, [rdx]
    L00c5: mov rcx, rbp
    L00c8: call qword ptr [0x7ffad7a64ed0]
    L00ce: mov rcx, rax
    L00d1: mov edx, 1
    L00d6: call qword ptr [0x7ffad7a65410]
    L00dc: mov rbp, rax
    L00df: mov rcx, 0x7ffad7a70fc0
    L00e9: mov edx, 3
    L00ee: call 0x00007ffb30beaf90
    L00f3: mov rdi, rax
    L00f6: mov r14, 0x7ffad7a70ea8
    L0100: mov rcx, r14
    L0103: call 0x00007ffb30beae10
    L0108: mov r15, rax
    L010b: mov r8, 0x1b5be853fd8
    L0115: mov r13, [r8]
    L0118: mov r8, r13
    L011b: mov rdx, 0x1b5bf0654e0
    L0125: mov r12, [rdx]
    L0128: mov rdx, r12
    L012b: mov rcx, r15
    L012e: call qword ptr [0x7ffad7a656b0]
    L0134: lea rcx, [rdi+0x10]
    L0138: mov rdx, r15
    L013b: call 0x00007ffb30bea680
    L0140: mov rcx, r14
    L0143: call 0x00007ffb30beae10
    L0148: mov r15, rax
    L014b: mov r8, 0x1b5be3140f8
    L0155: mov rax, [r8]
    L0158: mov [rsp+0x30], rax
    L015d: mov r8, rax
    L0160: mov rdx, 0x1b5bf0654e8
    L016a: mov r10, [rdx]
    L016d: mov [rsp+0x28], r10
    L0172: mov rdx, r10
    L0175: mov rcx, r15
    L0178: call qword ptr [0x7ffad7a656b0]
    L017e: lea rcx, [rdi+0x18]
    L0182: mov rdx, r15
    L0185: call 0x00007ffb30bea680
    L018a: mov rcx, r14
    L018d: call 0x00007ffb30beae10
    L0192: mov r15, rax
    L0195: mov r8, [rsp+0x30]
    L019a: mov rdx, 0x1b5bf0654f0
    L01a4: mov rax, [rdx]
    L01a7: mov [rsp+0x20], rax
    L01ac: mov rdx, rax
    L01af: mov rcx, r15
    L01b2: call qword ptr [0x7ffad7a656b0]
    L01b8: lea rcx, [rdi+0x20]
    L01bc: mov rdx, r15
    L01bf: call 0x00007ffb30bea680
    L01c4: mov rcx, rbp
    L01c7: mov rdx, rdi
    L01ca: call qword ptr [0x7ffad7a65278]
    L01d0: lea rcx, [rsi+0x10]
    L01d4: mov rdx, rax
    L01d7: call 0x00007ffb30bea680
    L01dc: mov rcx, rbx
    L01df: mov rdx, rsi
    L01e2: call qword ptr [0x7ffad78ddd88]
    L01e8: mov rcx, 0x7ffad7a70018
    L01f2: mov edx, 1
    L01f7: call 0x00007ffb30beaf90
    L01fc: mov rsi, rax
    L01ff: mov rcx, 0x1b5bf045b48
    L0209: mov rdi, [rcx]
    L020c: mov rcx, 0x7ffad7a4fd30
    L0216: call 0x00007ffb30beae10
    L021b: mov rbp, rax
    L021e: mov rdx, 0x1b5bf0654f8
    L0228: mov rdx, [rdx]
    L022b: mov rcx, rbp
    L022e: call qword ptr [0x7ffad7a64cf0]
    L0234: mov rcx, rdi
    L0237: cmp [rcx], ecx
    L0239: call qword ptr [0x7ffad7a64630]
    L023f: mov r8, rax
    L0242: mov rcx, rbp
    L0245: mov rdx, rdi
    L0248: call qword ptr [0x7ffad7a64840]
    L024e: test rax, rax
    L0251: je short L0266
    L0253: mov rcx, 0x7ffad7a4fd30
    L025d: cmp [rax], rcx
    L0260: jne L039b
    L0266: mov rdx, 0x1b5bf044168
    L0270: mov rdx, [rdx]
    L0273: mov rcx, rbp
    L0276: call qword ptr [0x7ffad7a64ed0]
    L027c: mov rdi, rax
    L027f: mov rcx, 0x7ffad7a70fc0
    L0289: mov edx, 3
    L028e: call 0x00007ffb30beaf90
    L0293: mov rbp, rax
    L0296: mov rcx, r14
    L0299: call 0x00007ffb30beae10
    L029e: mov r15, rax
    L02a1: mov r8, r13
    L02a4: mov rdx, r12
    L02a7: mov rcx, r15
    L02aa: call qword ptr [0x7ffad7a656b0]
    L02b0: lea rcx, [rbp+0x10]
    L02b4: mov rdx, r15
    L02b7: call 0x00007ffb30bea680
    L02bc: mov rcx, r14
    L02bf: call 0x00007ffb30beae10
    L02c4: mov r15, rax
    L02c7: mov r8, [rsp+0x30]
    L02cc: mov rdx, [rsp+0x28]
    L02d1: mov rcx, r15
    L02d4: call qword ptr [0x7ffad7a656b0]
    L02da: lea rcx, [rbp+0x18]
    L02de: mov rdx, r15
    L02e1: call 0x00007ffb30bea680
    L02e6: mov rcx, r14
    L02e9: call 0x00007ffb30beae10
    L02ee: mov r14, rax
    L02f1: mov r8, [rsp+0x30]
    L02f6: mov rdx, [rsp+0x20]
    L02fb: mov rcx, r14
    L02fe: call qword ptr [0x7ffad7a656b0]
    L0304: lea rcx, [rbp+0x20]
    L0308: mov rdx, r14
    L030b: call 0x00007ffb30bea680
    L0310: mov rcx, rdi
    L0313: mov rdx, rbp
    L0316: call qword ptr [0x7ffad7a65278]
    L031c: lea rcx, [rsi+0x10]
    L0320: mov rdx, rax
    L0323: call 0x00007ffb30bea680
    L0328: mov rcx, rbx
    L032b: mov rdx, rsi
    L032e: call qword ptr [0x7ffad78ddd88]
    L0334: test byte ptr [0x7ffad79370ca], 1
    L033b: je short L03a5
    L033d: mov rcx, 0x1b5bf043c28
    L0347: mov rcx, [rcx]
    L034a: mov edx, 1
    L034f: cmp [rcx], ecx
    L0351: call qword ptr [0x7ffad7a658f0]
    L0357: lea rcx, [rbx+0x88]
    L035e: mov rdx, rax
    L0361: call 0x00007ffb30bea680
    L0366: nop
    L0367: add rsp, 0x38
    L036b: pop rbx
    L036c: pop rbp
    L036d: pop rsi
    L036e: pop rdi
    L036f: pop r12
    L0371: pop r13
    L0373: pop r14
    L0375: pop r15
    L0377: ret
    L0378: mov rdx, rax
    L037b: call qword ptr [0x7ffad10543f0]
    L0381: int3
    L0382: mov rcx, 0x7ffad7936fa8
    L038c: mov edx, 0x1a3
    L0391: call 0x00007ffb30beafe0
    L0396: jmp L00b8
    L039b: mov rdx, rax
    L039e: call qword ptr [0x7ffad10543f0]
    L03a4: int3
    L03a5: mov rcx, 0x7ffad7936fa8
    L03af: mov edx, 0xf2
    L03b4: call 0x00007ffb30beafe0
    L03b9: jmp short L033d

Benchmarks.StringCompareDotNet8Benchmarks+<TestData>d__1..ctor(Int32)
    L0000: push rbx
    L0001: sub rsp, 0x20
    L0005: mov rbx, rcx
    L0008: mov [rbx+0x10], edx
    L000b: call System.Environment.get_CurrentManagedThreadId()
    L0010: mov [rbx+0x14], eax
    L0013: add rsp, 0x20
    L0017: pop rbx
    L0018: ret

Benchmarks.StringCompareDotNet8Benchmarks+<TestData>d__1.System.IDisposable.Dispose()
    L0000: ret

Benchmarks.StringCompareDotNet8Benchmarks+<TestData>d__1.MoveNext()
    L0000: push rsi
    L0001: push rbx
    L0002: sub rsp, 0x28
    L0006: mov rbx, rcx
    L0009: mov ecx, [rbx+0x10]
    L000c: cmp ecx, 5
    L000f: ja L0220
    L0015: lea rdx, [Benchmarks.StringCompareDotNet8Benchmarks+<TestData>d__1.MoveNext()]
    L001c: mov edx, [rdx+rcx*4]
    L001f: lea rax, [L0009]
    L0026: add rdx, rax
    L0029: jmp rdx
    L002b: mov dword ptr [rbx+0x10], 0xffffffff
    L0032: mov rcx, 0x7ffad0f9c4d8
    L003c: mov edx, 2
    L0041: call 0x00007ffb30beaf90
    L0046: mov rsi, rax
    L0049: lea rcx, [rsi+0x10]
    L004d: mov rdx, 0x1b5bf065500
    L0057: mov rdx, [rdx]
    L005a: call 0x00007ffb30bea680
    L005f: lea rcx, [rsi+0x18]
    L0063: mov rdx, 0x1b5bf065508
    L006d: mov rdx, [rdx]
    L0070: call 0x00007ffb30bea680
    L0075: lea rcx, [rbx+8]
    L0079: mov rdx, rsi
    L007c: call 0x00007ffb30bea680
    L0081: mov dword ptr [rbx+0x10], 1
    L0088: jmp L020d
    L008d: mov dword ptr [rbx+0x10], 0xffffffff
    L0094: mov rcx, 0x7ffad0f9c4d8
    L009e: mov edx, 2
    L00a3: call 0x00007ffb30beaf90
    L00a8: mov rsi, rax
    L00ab: lea rcx, [rsi+0x10]
    L00af: mov rdx, 0x1b5bf065510
    L00b9: mov rdx, [rdx]
    L00bc: call 0x00007ffb30bea680
    L00c1: lea rcx, [rsi+0x18]
    L00c5: mov rdx, 0x1b5bf065518
    L00cf: mov rdx, [rdx]
    L00d2: call 0x00007ffb30bea680
    L00d7: lea rcx, [rbx+8]
    L00db: mov rdx, rsi
    L00de: call 0x00007ffb30bea680
    L00e3: mov dword ptr [rbx+0x10], 2
    L00ea: jmp L020d
    L00ef: mov dword ptr [rbx+0x10], 0xffffffff
    L00f6: mov rcx, 0x7ffad0f9c4d8
    L0100: mov edx, 2
    L0105: call 0x00007ffb30beaf90
    L010a: mov rsi, rax
    L010d: lea rcx, [rsi+0x10]
    L0111: mov rdx, 0x1b5bf065520
    L011b: mov rdx, [rdx]
    L011e: call 0x00007ffb30bea680
    L0123: lea rcx, [rsi+0x18]
    L0127: mov rdx, 0x1b5bf065528
    L0131: mov rdx, [rdx]
    L0134: call 0x00007ffb30bea680
    L0139: lea rcx, [rbx+8]
    L013d: mov rdx, rsi
    L0140: call 0x00007ffb30bea680
    L0145: mov dword ptr [rbx+0x10], 3
    L014c: jmp L020d
    L0151: mov dword ptr [rbx+0x10], 0xffffffff
    L0158: mov rcx, 0x7ffad0f9c4d8
    L0162: mov edx, 2
    L0167: call 0x00007ffb30beaf90
    L016c: mov rsi, rax
    L016f: lea rcx, [rsi+0x10]
    L0173: mov rdx, 0x1b5bf065530
    L017d: mov rdx, [rdx]
    L0180: call 0x00007ffb30bea680
    L0185: lea rcx, [rsi+0x18]
    L0189: mov rdx, 0x1b5bf065538
    L0193: mov rdx, [rdx]
    L0196: call 0x00007ffb30bea680
    L019b: lea rcx, [rbx+8]
    L019f: mov rdx, rsi
    L01a2: call 0x00007ffb30bea680
    L01a7: mov dword ptr [rbx+0x10], 4
    L01ae: jmp short L020d
    L01b0: mov dword ptr [rbx+0x10], 0xffffffff
    L01b7: mov rcx, 0x7ffad0f9c4d8
    L01c1: mov edx, 2
    L01c6: call 0x00007ffb30beaf90
    L01cb: mov rsi, rax
    L01ce: lea rcx, [rsi+0x10]
    L01d2: mov rdx, 0x1b5bf065540
    L01dc: mov rdx, [rdx]
    L01df: call 0x00007ffb30bea680
    L01e4: lea rcx, [rsi+0x18]
    L01e8: mov rdx, 0x1b5bf065548
    L01f2: mov rdx, [rdx]
    L01f5: call 0x00007ffb30bea680
    L01fa: lea rcx, [rbx+8]
    L01fe: mov rdx, rsi
    L0201: call 0x00007ffb30bea680
    L0206: mov dword ptr [rbx+0x10], 5
    L020d: mov eax, 1
    L0212: add rsp, 0x28
    L0216: pop rbx
    L0217: pop rsi
    L0218: ret
    L0219: mov dword ptr [rbx+0x10], 0xffffffff
    L0220: xor eax, eax
    L0222: add rsp, 0x28
    L0226: pop rbx
    L0227: pop rsi
    L0228: ret

Benchmarks.StringCompareDotNet8Benchmarks+<TestData>d__1.System.Collections.Generic.IEnumerator<System.Object[]>.get_Current()
    L0000: mov rax, [rcx+8]
    L0004: ret

Benchmarks.StringCompareDotNet8Benchmarks+<TestData>d__1.System.Collections.IEnumerator.Reset()
    L0000: push rbx
    L0001: sub rsp, 0x20
    L0005: mov rcx, 0x7ffad1168460
    L000f: call 0x00007ffb30beae10
    L0014: mov rbx, rax
    L0017: mov rcx, rbx
    L001a: call qword ptr [0x7ffad1176490]
    L0020: mov rcx, rbx
    L0023: call 0x00007ffb30b28b00
    L0028: int3

Benchmarks.StringCompareDotNet8Benchmarks+<TestData>d__1.System.Collections.IEnumerator.get_Current()
    L0000: mov rax, [rcx+8]
    L0004: ret

Benchmarks.StringCompareDotNet8Benchmarks+<TestData>d__1.System.Collections.Generic.IEnumerable<System.Object[]>.GetEnumerator()
    L0000: push rsi
    L0001: push rbx
    L0002: sub rsp, 0x28
    L0006: mov rbx, rcx
    L0009: cmp dword ptr [rbx+0x10], 0xfffffffe
    L000d: jne short L0022
    L000f: mov esi, [rbx+0x14]
    L0012: call System.Environment.get_CurrentManagedThreadId()
    L0017: cmp esi, eax
    L0019: jne short L0022
    L001b: xor ecx, ecx
    L001d: mov [rbx+0x10], ecx
    L0020: jmp short L0041
    L0022: mov rcx, 0x7ffad792d2c0
    L002c: call 0x00007ffb30beae10
    L0031: mov rbx, rax
    L0034: xor eax, eax
    L0036: mov [rbx+0x10], eax
    L0039: call System.Environment.get_CurrentManagedThreadId()
    L003e: mov [rbx+0x14], eax
    L0041: mov rax, rbx
    L0044: add rsp, 0x28
    L0048: pop rbx
    L0049: pop rsi
    L004a: ret

Benchmarks.StringCompareDotNet8Benchmarks+<TestData>d__1.System.Collections.IEnumerable.GetEnumerator()
    L0000: jmp Benchmarks.StringCompareDotNet8Benchmarks+<TestData>d__1.System.Collections.Generic.IEnumerable<System.Object[]>.GetEnumerator()


Benchmark Description:


### General Setup Overview The benchmark setup provided is designed to compare the performance of string comparison operations in different versions of .NET, specifically targeting .NET 7 and .NET 8. The benchmarks are implemented using the BenchmarkDotNet library, a powerful tool for benchmarking .NET code, which provides detailed insights into the performance characteristics of the code being tested. #### Configuration Details: - **.NET Versions:** The benchmarks are configured to run against two different .NET versions: .NET 7 and .NET 8. This is achieved by specifying two jobs in the configuration, each targeting a different version of the .NET Core runtime (`CoreRuntime.Core70` and `CoreRuntime.Core80`). - **Compilation Configurations:** The benchmarks disable Ahead-of-Time (AOT) compilation by setting the `DOTNET_ReadyToRun` environment variable to "0". They also enable Quick JIT for loops and Tiered Profile-Guided Optimization (PGO) by setting the `DOTNET_TC_QuickJitForLoops` and `DOTNET_TieredPGO` environment variables to "1". - **BenchmarkDotNet Configuration:** The benchmarks use a custom configuration class (`Config`) that extends `ManualConfig`. This class specifies the jobs to run and sets the summary style to display ratios as percentages. It also hides certain columns (`Column.Job`, `Column.RatioSD`, `Column.AllocRatio`) for clarity in the output. ### Benchmark Method: `EqualsIgnoreCase` #### Purpose: The `EqualsIgnoreCase` method is designed to benchmark the performance of case-insensitive string comparisons across different string lengths and contents. This method uses the `String.Equals` method with the `StringComparison.OrdinalIgnoreCase` option to perform the comparison. #### Performance Aspect Tested: This benchmark tests how efficiently the .NET runtime can perform case-insensitive string comparisons, a common operation in many applications. It specifically looks at: - The overhead of case-insensitive comparisons for short strings. - The utilization of SIMD (Single Instruction, Multiple Data) instructions for medium-length strings. - The performance for strings of various lengths, including those that may or may not fit into processor cache lines or require multiple SIMD operations. #### Expected Results/Insights: - **Short Strings:** For very short strings (e.g., 3 characters), the benchmark tests the overhead of the comparison operation. The expectation is that the performance impact is minimal, but interesting to compare between .NET versions. - **Medium-Length Strings:** For strings that are long enough to benefit from SIMD optimizations (e.g., 8 characters), we expect to see a significant performance improvement, especially in newer .NET versions that might have enhanced SIMD support. - **Long Strings:** For longer strings (e.g., 46 and 226 characters), the benchmark tests the efficiency of the runtime's string comparison algorithms over multiple processor cache lines and SIMD operations. Improvements in these areas could indicate optimizations in the .NET runtime's string handling or JIT compilation strategies. By comparing the performance across different .NET versions, developers and performance engineers can gain insights into the runtime and JIT compiler optimizations that have been introduced. This can help in making informed decisions about upgrading projects to newer .NET versions or optimizing string comparison operations in their applications.


Benchmark Comments: