[C#] JIT ๊ตฌ์กฐ

[์›๋ณธ ๋งํฌ]

C#, dotnet ๋Ÿฐํƒ€์ž„์—์„œ JIT ์ตœ์ ํ™”๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ฒ ๋‹ค.

Java์™€ ๋น„๊ตํ•˜๋ฉด์„œ ๋ณด๋Š” ๊ฒƒ๋„ ์˜๋ฏธ๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค. JVM๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€๋Š” ์•Š๋‹ค.
https://blog.naver.com/sssang97/223573816314




JIT ์ปดํŒŒ์ผ

JIT ์ปดํŒŒ์ผ์ด๋ž€, ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์ค‘์— ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์‹ค์ œ ๋จธ์‹ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ๋งํ•œ๋‹ค.

C# ์ปดํŒŒ์ผ๋Ÿฌ๋Š” C# ์ฝ”๋“œ๋ฅผ CIL(Common Intermediate Language)๋ผ๊ณ  ํ•˜๋Š” ์ค‘๊ฐ„ ์–ธ์–ด๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๊ฒƒ์— ๋ถˆ๊ณผํ•˜๊ณ , C# ๋Ÿฐํƒ€์ž„์€ ๊ทธ CIL ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ด์ฃผ๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋‹ค.

๋‹น์—ฐํžˆ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋จธ์‹ ์ฝ”๋“œ์— ๋น„ํ•˜๋ฉด ํ›จ์”ฌ ๋А๋ฆฌ๋‹ค. Python ๊ฐ™์€ ์ˆœ์ˆ˜ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๋А๋ฆฐ ์ด์œ ์ด๊ธฐ๋„ ํ•˜๋‹ค.

ํ•˜์ง€๋งŒ C#, Java ๋“ฑ์˜ ์–ธ์–ด๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, CIL๋ฅผ ๊ทธ๋•Œ๊ทธ๋•Œ ์ตœ์ ํ™”๋œ ๋จธ์‹ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์‹คํ–‰ํ•œ๋‹ค.

https://www.geeksforgeeks.org/python/what-is-just-in-time-jit-compiler-in-dot-net/
์ด๊ฒŒ ๋А๋ฆฌ๋‹ค๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ด ๋‚˜์˜ค์ง€ ์•Š๋Š” ์ด์œ ๋‹ค.




๊ณ„์ธตํ™”๋œ ์ปดํŒŒ์ผ (Tiered Compilation)

์ด๊ฑด .Net Core 3.0๋ถ€ํ„ฐ ๊ธฐ๋ณธ์œผ๋กœ ์ ์šฉ๋˜์–ด์žˆ๋‹ค.

๊ทผ๋ฐ ํ•ญ์ƒ ๊ทน๋„๋กœ ์ตœ์ ํ™”๋œ ๋จธ์‹ ์ฝ”๋“œ๋ฅผ ๋ฝ‘์•„๋‚ด์„œ ์‹คํ–‰ํ•˜๋ฉด ์ข‹๊ธด ํ•˜๊ฒ ์ง€๋งŒ, ํ•ญ์ƒ ๊ทธ๋Ÿฌ๋Š”๊ฑด ํšจ์œจ์ ์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ์ผ๋‹จ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ ๊ฒƒ์ด๊ณ , ์‹คํ–‰์ค‘์— ๋‚ญ๋น„ํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋„ ์ปค์งˆ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์ ๋‹นํžˆ ์ ˆ์ถฉํ•ด์„œ ๋„์ž…ํ•œ ๊ฐœ๋…์ด Tired Compile์ด๋‹ค.
JVM Hotspot์—์„œ C1, C2 ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋‚˜๋ˆ ๋‘” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๋‹ค.

Tier0, Tier1์œผ๋กœ ๊ตฌ๋ถ„๋˜๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”์„œ๋“œ ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.
JVM๊ณผ์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€, ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ชจ๋“œ ์—†์ด ๊ฐ€๋ฒผ์šด ์ตœ์ ํ™”(Tier0)๋กœ ๋ฐ”๋กœ ์ง„์ž…ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.


Tier0

Tier0๋Š” ๊ฐ€๋ฒผ์šด ์ตœ์ ํ™”๋ฅผ ๊ฑฐ์นœ ์ฝ”๋“œ๋‹ค. ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์ ํ™” ์ˆ˜์ค€์€ ๋†’์ง€ ์•Š์€ ์ฑ„๋กœ ์ƒ์„ฑํ•œ๋‹ค.
ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์—†๋‹ค๋ฉด Tier0๋กœ ์‹œ์ž‘ํ•˜๋ฉฐ, ๋ฃจํ”„๊ฐ€ ์—†๋Š” ๋‹จ์ˆœํ•œ ๋ฉ”์„œ๋“œ๋ผ๋ฉด ๋”์šฑ ๋” Tier0๊ฐ€ ์„ ํ˜ธ๋œ๋‹ค.


Tier1

Tier0 ๋‹จ๊ณ„์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์ผ์ • ํšŸ์ˆ˜ ์ด์ƒ ํ˜ธ์ถœ๋œ๋‹ค๋ฉด Tier1๋กœ ํŒ๋‹จํ•˜๊ณ  ๋‹ค์‹œ ์ œ๋Œ€๋กœ ์ตœ์ ํ™”๋ฅผ ํ•œ๋‹ค.
"์ผ์ • ํšŸ์ˆ˜"๋Š” ํ˜„์žฌ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ํšŸ์ˆ˜ ๊ธฐ์ค€ 30์œผ๋กœ ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด์žˆ๋‹ค. ์ถ”ํ›„ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์€ ์žˆ๋‹ค.




Tier0(QuickJit)์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜

๊ทผ๋ฐ ์•„๋ฌด๋ž˜๋„ tier0 ์ฝ”๋“œ๋Š” ๋Œ€์ถฉ ์ตœ์ ํ™”๋ฅผ ํ•˜๋Š”๊ฑฐ๋ผ์„œ ์ง€๋‚˜์น˜๊ฒŒ ๋น„ํšจ์œจ์ ์œผ๋กœ ์ปดํŒŒ์ผ์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค.
๊ทธ๋ž˜์„œ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ๋Š” tiered ์˜ต์…˜์„ ๋ถ€๋ถ„์ ์œผ๋กœ, ํ˜น์€ ์ „์—ญ์ ์œผ๋กœ ๋„๊ธฐ๋ฅผ ์›ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๋ถ€๋ถ„์ ์œผ๋กœ ์ ์šฉํ•˜๋ ค๋ฉด ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๋‹ค์Œ๊ณผ ๊ฐ™์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์ง€์ •ํ•˜๋ฉด tier0๋กœ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๋Š”๋‹ค.

        [MethodImpl(MethodImplOptions.AggressiveOptimization | MethodImplOptions.NoInlining)]
        public static void M1()
        {
            Interlocked.Increment(ref Test);
        }

ํ˜น์€, ๊ทธ๋ƒฅ ์ „์—ญ์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
์ด๋Ÿฌ๋ฉด ๊ทธ๋ƒฅ TieredCompilation๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ ˆ๊ฑฐ์‹œ ๋ชจ๋“œ๋กœ ์‹คํ–‰๋œ๋‹ค.
๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, tier0 ์—†์ด ๋ฐ”๋กœ ์ตœ์ ํ™”๋œ ์ฝ”๋“œ(tier1)๋กœ ์‹คํ–‰ํ•˜๋Š” ๋ฒ„์ „์ธ ๊ฒƒ์ด๋‹ค.

<TieredCompilation>false</TieredCompilation>



์ฐธ์กฐ
https://learn.microsoft.com/ko-kr/visualstudio/debugger/jit-optimization-and-debugging?view=vs-2022
https://github.com/dotnet/runtime/blob/main/docs/design/features/tiered-compilation.md
https://learn.microsoft.com/ko-kr/dotnet/core/whats-new/dotnet-core-3-0#tiered-compilation