Runtime: рдЬреЗрдЖрдИрдЯреА рдХреЛ рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪреЗрдХ рдкреИрдЯрд░реНрди рдХреЛ рдкрд╣рдЪрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдП

рдХреЛ рдирд┐рд░реНрдорд┐рдд 3 рдирд╡ре░ 2018  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: dotnet/runtime

рдореБрдЭреЗ @GrabYourPitchforks https://github.com/dotnet/coreclr/pull/20386 рдореЗрдВ рдЯреНрд░рд┐рдХ рдорд┐рд▓реА рд╣реИ
рдЬреЗрдЖрдИрдЯреА рдкреИрдЯрд░реНрди рдХреЛ рдкрд╣рдЪрд╛рди рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕реАрд▓рдмрдВрдж рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред
```рд╕реА#
[MethodImpl(MethodImplOptions.NoInlining)]
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ int рд╣реИ (рд╡рд╕реНрддреБ obj)
{
рдЕрдЧрд░ (obj рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдЯреНрд░ рд╣реИ)
рд╡рд╛рдкрд╕реА str.Length;

        return 7;
    }

    [MethodImpl(MethodImplOptions.NoInlining)]
    public static int As(object obj)
    {
        string str = obj as string;

        if (str != null)
            return str.Length;

        return 7;
    }

    [MethodImpl(MethodImplOptions.NoInlining)]
    public static int SafeUnsafe(object obj)
    {
        if (obj != null && obj.GetType() == typeof(string))
            return Unsafe.As<string>(obj).Length;

        return 7;
    }
<details><summary>See the generated code</summary><p>

```ASM
; Assembly listing for method Program:Is(ref):int
; Emitting BLENDED_CODE for X64 CPU with AVX
; optimized code
; rsp based frame
; partially interruptible
; Final local variable assignments
;
;  V00 arg0         [V00,T01] (  3,  3   )     ref  ->  rcx         class-hnd
;  V01 loc0         [V01,T02] (  3,  2.50)     ref  ->  rax         class-hnd
;# V02 OutArgs      [V02    ] (  1,  1   )  lclBlk ( 0) [rsp+0x00]  
;  V03 tmp1         [V03,T00] (  5,  6.74)     ref  ->  rax         class-hnd
;
; Lcl frame size = 0

G_M12761_IG01:
       0F1F440000           nop      

G_M12761_IG02:
       488BC1               mov      rax, rcx
       4885C0               test     rax, rax
       7411                 je       SHORT G_M12761_IG03
       48BA00F50A96FE7F0000 mov      rdx, 0x7FFE960AF500
       483910               cmp      qword ptr [rax], rdx
       7402                 je       SHORT G_M12761_IG03
       33C0                 xor      rax, rax

G_M12761_IG03:
       4885C0               test     rax, rax
       7404                 je       SHORT G_M12761_IG05
       8B4008               mov      eax, dword ptr [rax+8]

G_M12761_IG04:
       C3                   ret      

G_M12761_IG05:
       B807000000           mov      eax, 7

G_M12761_IG06:
       C3                   ret      

; Total bytes of code 45, prolog size 5 for method Program:Is(ref):int
; ============================================================


; Assembly listing for method Program:As(ref):int
; Emitting BLENDED_CODE for X64 CPU with AVX
; optimized code
; rsp based frame
; partially interruptible
; Final local variable assignments
;
;  V00 arg0         [V00,T01] (  3,  3   )     ref  ->  rcx         class-hnd
;  V01 loc0         [V01,T02] (  3,  2.50)     ref  ->  rax         class-hnd
;# V02 OutArgs      [V02    ] (  1,  1   )  lclBlk ( 0) [rsp+0x00]  
;  V03 tmp1         [V03,T00] (  5,  6.74)     ref  ->  rax         class-hnd
;
; Lcl frame size = 0

G_M12497_IG01:
       0F1F440000           nop      

G_M12497_IG02:
       488BC1               mov      rax, rcx
       4885C0               test     rax, rax
       7411                 je       SHORT G_M12497_IG03
       48BA00F50A96FE7F0000 mov      rdx, 0x7FFE960AF500
       483910               cmp      qword ptr [rax], rdx
       7402                 je       SHORT G_M12497_IG03
       33C0                 xor      rax, rax

G_M12497_IG03:
       4885C0               test     rax, rax
       7404                 je       SHORT G_M12497_IG05
       8B4008               mov      eax, dword ptr [rax+8]

G_M12497_IG04:
       C3                   ret      

G_M12497_IG05:
       B807000000           mov      eax, 7

G_M12497_IG06:
       C3                   ret      

; Total bytes of code 45, prolog size 5 for method Program:As(ref):int
; ============================================================


; Assembly listing for method Program:SafeUnsafe(ref):int
; Emitting BLENDED_CODE for X64 CPU with AVX
; optimized code
; rsp based frame
; partially interruptible
; Final local variable assignments
;
;  V00 arg0         [V00,T00] (  5,  4   )     ref  ->  rcx         class-hnd
;# V01 OutArgs      [V01    ] (  1,  1   )  lclBlk ( 0) [rsp+0x00]  
;
; Lcl frame size = 0

G_M6777_IG01:
       0F1F440000           nop      

G_M6777_IG02:
       4885C9               test     rcx, rcx
       7413                 je       SHORT G_M6777_IG04
       48B800F50A96FE7F0000 mov      rax, 0x7FFE960AF500
       483901               cmp      qword ptr [rcx], rax
       7504                 jne      SHORT G_M6777_IG04
       8B4108               mov      eax, dword ptr [rcx+8]

G_M6777_IG03:
       C3                   ret      

G_M6777_IG04:
       B807000000           mov      eax, 7

G_M6777_IG05:
       C3                   ret      

; Total bytes of code 35, prolog size 5 for method Program:SafeUnsafe(ref):int
; ============================================================

рдФрд░ rax рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛

cmp      qword ptr [rcx], 0x7FFE960AF500

рдХреА рдмрдЬрд╛рдп

mov      rax, 0x7FFE960AF500
cmp      qword ptr [rcx], rax

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рд╣реЛрдирд╛ (рдФрд░ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛) рдЙрдкрдпреЛрдЧреА рд╣реИред

рдХреГрдкрдпрд╛ рдЪреАрдЬрд╝реЛрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдкреАрдЫреЗ рди рд╣рдЯреЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдЬреНрдЮрд╛рдд рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд┐рдВрддрд┐рдд рд╣реИрдВред рдХрднреА-рдХрднреА рд╕рдорд╛рди рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬреЗрдВ рдЕрдВрдд рдореЗрдВ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВред

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬреНрдЮрд╛рдд рдХреНрд╖реЗрддреНрд░ рд╣реИ (рджреЗрдЦреЗрдВ рдбреЙрдЯрдиреЗрдЯ/рд░рдирдЯрд╛рдЗрдо#9117)ред

рдЕрдзрд┐рдХрд╛рдВрд╢ x64 рдирд┐рд░реНрджреЗрд╢ рдмрдбрд╝реЗ рд╢рд╛рдмреНрджрд┐рдХ рдирд┐рд░рдВрддрд░ рдСрдкрд░реЗрдВрдб рдХреЛ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрдк mov; cmp рдЬреИрд╕рд╛ рдЖрдк рдКрдкрд░ рджреЗрдЦрддреЗ рд╣реИрдВ, рджреЗрдЦрддреЗ рд╣реИрдВред

рдбреБрдкреНрд╕ рдХрд╛ рд╕рдкреНрддрд╛рд╣ :)
рд╕рдорд╛рдкрдиред

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рд╣реЛрдирд╛ (рдФрд░ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛) рдЙрдкрдпреЛрдЧреА рд╣реИред

рдХреГрдкрдпрд╛ рдЪреАрдЬрд╝реЛрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдкреАрдЫреЗ рди рд╣рдЯреЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдЬреНрдЮрд╛рдд рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд┐рдВрддрд┐рдд рд╣реИрдВред рдХрднреА-рдХрднреА рд╕рдорд╛рди рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬреЗрдВ рдЕрдВрдд рдореЗрдВ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕