Runtime: JIT๋Š” ์ธ๊ธฐ ์žˆ๋Š” ์œ ํ˜• ๊ฒ€์‚ฌ ํŒจํ„ด์„ ์ธ์‹ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2018๋…„ 11์›” 03์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dotnet/runtime

@GrabYourPitchforks https://github.com/dotnet/coreclr/pull/20386 ์—์„œ ํŠธ๋ฆญ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.
JIT๋Š” ํŒจํ„ด์„ ์ธ์‹ํ•˜๊ณ  ๋ด‰์ธ๋œ ์œ ํ˜•์— ๋Œ€ํ•ด ์ตœ์ ํ™”๋œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
```C#
[MethodImpl(MethodImplOptions.NoInlining)]
public static int Is(๊ฐ์ฒด obj)
{
if (obj๋Š” ๋ฌธ์ž์—ด str)
๋ฐ˜ํ™˜ 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 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

jamesqo picture jamesqo  ยท  3์ฝ”๋ฉ˜ํŠธ

ilmax picture ilmax  ยท  3์ฝ”๋ฉ˜ํŠธ

aggieben picture aggieben  ยท  3์ฝ”๋ฉ˜ํŠธ

btecu picture btecu  ยท  3์ฝ”๋ฉ˜ํŠธ

chunseoklee picture chunseoklee  ยท  3์ฝ”๋ฉ˜ํŠธ