Runtime: JIT Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ популярный шаблон ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠ°

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 3 нояб. 2018  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: dotnet/runtime

Π― нашСл ΡƒΠ»ΠΎΠ²ΠΊΡƒ Π² @GrabYourPitchforks https://github.com/dotnet/coreclr/pull/20386
JIT ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ шаблон ΠΈ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ для Π·Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ².
`` Π‘ #
[MethodImpl (MethodImplOptions.NoInlining)]
общСдоступный статичСский int Is (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ obj)
{
Ссли (obj - строка str)
return 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 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π­Ρ‚ΠΎ извСстная ΠΎΠ±Π»Π°ΡΡ‚ΡŒ для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ (см. Dotnet / runtime # 9117).

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ инструкций x64 Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ большиС Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΡŒΠ½Ρ‹Π΅ постоянныС ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹, поэтому Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ mov; cmp ΠΊΠ°ΠΊ ΠΈ Π²Ρ‹ΡˆΠ΅.

НСдСля дупсов :)
Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅.

Π’Π°ΠΊΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ (ΠΈ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎ Π½ΠΈΡ…).

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, Π½Π΅ Π²ΠΎΠ·Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΠΉΡ‚Π΅ΡΡŒ ΠΎΡ‚ сообщСния ΠΎ Π²Π΅Ρ‰Π°Ρ…, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚Π΅ΡΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΎ Ρ‡Π΅ΠΌ-Ρ‚ΠΎ ΡƒΠΆΠ΅ извСстном. Иногда ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ Π²Π΅Ρ‰ΠΈ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ ΠΈ ΠΏΠΎΡ…ΠΎΠΆΠΈ.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ