.NET Core์˜ ์„ฑ๋Šฅ

.NET Core์˜ ์„ฑ๋Šฅ

.NET Core์˜ ์„ฑ๋Šฅ

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„! ์ด ๊ธ€์€ ๋™๋ฃŒ๋“ค๊ณผ ์ œ๊ฐ€ ์˜ค๋žซ๋™์•ˆ ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•ด ์˜จ ๋ชจ๋ฒ” ์‚ฌ๋ก€ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค.

๊ณ„์‚ฐ์ด ์ˆ˜ํ–‰๋œ ๊ธฐ๊ณ„์— ๋Œ€ํ•œ ์ •๋ณด:BenchmarkDotNet=v0.11.5, OS=Windows 10.0.18362
Intel Core i5-8250U CPU 1.60GHz(Kaby Lake R), CPU 1๊ฐœ, ๋…ผ๋ฆฌ ์ฝ”์–ด 8๊ฐœ ๋ฐ ๋ฌผ๋ฆฌ ์ฝ”์–ด 4๊ฐœ
.NET ์ฝ”์–ด SDK=3.0.100
[ํ˜ธ์ŠคํŠธ]: .NET Core 2.2.7(CoreCLR 4.6.28008.02, CoreFX 4.6.28008.03), 64๋น„ํŠธ RyuJIT
์ฝ”์–ด: .NET Core 2.2.7(CoreCLR 4.6.28008.02, CoreFX 4.6.28008.03), 64๋น„ํŠธ RyuJIT
[ํ˜ธ์ŠคํŠธ]: .NET Core 3.0.0(CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64๋น„ํŠธ RyuJIT
์ฝ”์–ด: .NET Core 3.0.0(CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64๋น„ํŠธ RyuJIT

์ž‘์—…=์ฝ”์–ด ๋Ÿฐํƒ€์ž„=์ฝ”์–ด

ToList์™€ ToArray ๋ฐ ์‚ฌ์ดํด


.NET Core 3.0 ์ถœ์‹œ์™€ ํ•จ๊ป˜ ์ด๋Ÿฐ ์ •๋ณด๋ฅผ ์ค€๋น„ํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ๋„ˆ๋ฌด ์ด๊ธฐ๋”๋ผ๊ตฌ์š”. ๋‚จ์˜ ์˜๊ด‘์„ ํ›”์น˜๊ณ  ๋‚จ์˜ ์ •๋ณด๋ฅผ ๋ฒ ๋ผ๊ณ  ์‹ถ์ง€ ์•Š์œผ๋‹ˆ ์ฐธ๊ณ ๋งŒ ํ• ๊ฒŒ์š”. ๋น„๊ต๊ฐ€ ์ž์„ธํžˆ ์„ค๋ช…๋˜์–ด ์žˆ๋Š” ์ข‹์€ ๊ธฐ์‚ฌ ๋งํฌ.

๋‚˜ ์ž์‹ ์„ ๋Œ€์‹ ํ•˜์—ฌ ๋‚˜๋Š” ๋‹จ์ง€ ๋‚ด ์ธก์ •๊ณผ ๊ฒฐ๊ณผ๋ฅผ ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์„ ๋ฟ์ด๋ฉฐ, ๋ฃจํ”„ ์ž‘์„ฑ์˜ "C++ ์Šคํƒ€์ผ"์„ ์ข‹์•„ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์—ญ๋ฐฉํ–ฅ ๋ฃจํ”„๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์•”ํ˜ธ:

public class Bench
    {
        private List<int> _list;
        private int[] _array;

        [Params(100000, 10000000)] public int N;

        [GlobalSetup]
        public void Setup()
        {
            const int MIN = 1;
            const int MAX = 10;
            Random random = new Random();
            _list = Enumerable.Repeat(0, N).Select(i => random.Next(MIN, MAX)).ToList();
            _array = _list.ToArray();
        }

        [Benchmark]
        public int ForList()
        {
            int total = 0;
            for (int i = 0; i < _list.Count; i++)
            {
                total += _list[i];
            }

            return total;
        }
        
        [Benchmark]
        public int ForListFromEnd()
        {
            int total = 0;t
            for (int i = _list.Count-1; i > 0; i--)
            {
                total += _list[i];
            }

            return total;
        }

        [Benchmark]
        public int ForeachList()
        {
            int total = 0;
            foreach (int i in _list)
            {
                total += i;
            }

            return total;
        }

        [Benchmark]
        public int ForeachArray()
        {
            int total = 0;
            foreach (int i in _array)
            {
                total += i;
            }

            return total;
        }

        [Benchmark]
        public int ForArray()
        {
            int total = 0;
            for (int i = 0; i < _array.Length; i++)
            {
                total += _array[i];
            }

            return total;
        }
        
        [Benchmark]
        public int ForArrayFromEnd()
        {
            int total = 0;
            for (int i = _array.Length-1; i > 0; i--)
            {
                total += _array[i];
            }

            return total;
        }
    }

.NET Core 2.2์™€ 3.0์˜ ์„ฑ๋Šฅ ์†๋„๋Š” ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. .NET Core 3.0์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

.NET Core์˜ ์„ฑ๋Šฅ

.NET Core์˜ ์„ฑ๋Šฅ

๋‚ด๋ถ€ ์ตœ์ ํ™” ๋ฐ ๋ช…์‹œ์ ์ธ ์ปฌ๋ ‰์…˜ ํฌ๊ธฐ ํ• ๋‹น์œผ๋กœ ์ธํ•ด ๋ฐฐ์—ด ์ปฌ๋ ‰์…˜์˜ ๋ฐ˜๋ณต ์ฒ˜๋ฆฌ๊ฐ€ ๋” ๋น ๋ฅด๋‹ค๋Š” ๊ฒฐ๋ก ์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชฉ๋ก ์ปฌ๋ ‰์…˜์—๋Š” ๊ณ ์œ ํ•œ ์žฅ์ ์ด ์žˆ์œผ๋ฏ€๋กœ ํ•„์š”ํ•œ ๊ณ„์‚ฐ์— ๋”ฐ๋ผ ์˜ฌ๋ฐ”๋ฅธ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฃจํ”„ ์ž‘์—…์„ ์œ„ํ•œ ๋กœ์ง์„ ์ž‘์„ฑํ•˜๋”๋ผ๋„ ์ด๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ๋ฃจํ”„์ด๋ฉฐ ๋ฃจํ”„ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ฝค ์˜ค๋ž˜ ์ „์— habr์— ๊ธฐ์‚ฌ๊ฐ€ ๊ฒŒ์žฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. https://habr.com/ru/post/124910/. ์—ฌ์ „ํžˆ ๊ด€๋ จ์„ฑ์ด ์žˆ์œผ๋ฉฐ ์ฝ๊ธฐ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋˜์ง€๋‹ค

XNUMX๋…„ ์ „, ์ €๋Š” ๋ ˆ๊ฑฐ์‹œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ํšŒ์‚ฌ์—์„œ ์ผํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ๋Š” try-catch-throw ๊ตฌ์„ฑ์„ ํ†ตํ•ด ํ•„๋“œ ๊ฒ€์ฆ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๊ฑด์ „ํ•˜์ง€ ๋ชปํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ๋ผ๋Š” ๊ฒƒ์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•  ๋•Œ๋งˆ๋‹ค ๊ทธ๋Ÿฌํ•œ ๋””์ž์ธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋Ÿฌํ•œ ๊ตฌ์„ฑ์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์ด ์™œ ๋‚˜์œ์ง€ ์•Œ์•„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๊ฐ ์˜ต์…˜์— ๋Œ€ํ•œ ๋ฒค์น˜๋งˆํฌ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์•”ํ˜ธ:

        public bool ContainsHash()
        {
            bool result = false;
            foreach (var file in _files)
            {
                var extension = Path.GetExtension(file);
                if (_hash.Contains(extension))
                    result = true;
            }

            return result;
        }

        public bool ContainsHashTryCatch()
        {
            bool result = false;
            try
            {
                foreach (var file in _files)
                {
                    var extension = Path.GetExtension(file);
                    if (_hash.Contains(extension))
                        result = true;
                }
                
                if(!result) 
                    throw new Exception("false");
            }
            catch (Exception e)
            {
                result = false;
            }

            return result;
        }

.NET Core 3.0 ๋ฐ Core 2.2์˜ ๊ฒฐ๊ณผ๋Š” ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค(.NET Core 3.0).

.NET Core์˜ ์„ฑ๋Šฅ

.NET Core์˜ ์„ฑ๋Šฅ

Try catch๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ์ง€๊ณ  ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ตฌ์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ ์ค„์„ ์‚ฝ์ž…ํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์‹œ์Šคํ…œ์„ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ์˜ˆ์™ธ ์ƒ์„ฑ ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ์˜ค๋ฅ˜ ์ž์ฒด๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” ๊ฒƒ์€ ํ•„์š”ํ•œ ํ˜•์‹์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ์ผ๋ถ€ ํด๋ž˜์Šค๋ณด๋‹ค ๋Š๋ฆฝ๋‹ˆ๋‹ค. ์–‘์‹์ด๋‚˜ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌ ์ค‘์ด๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์ฒ˜๋ฆฌํ•ด ๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”?

์ด ์ƒํ™ฉ์ด ์˜ˆ์™ธ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ throw new Exception() ๊ตฌ๋ฌธ์„ ์ž‘์„ฑํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋˜์ง€๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋น„์Œ‰๋‹ˆ๋‹ค!!!

ToLower, ToLowerInvariant, ToUpper, ToUpperInvariant

5๋…„ ๋™์•ˆ .NET ํ”Œ๋žซํผ์—์„œ ์ž‘์—…ํ•˜๋ฉด์„œ ๋ฌธ์ž์—ด ์ผ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋งŽ์€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ ‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค์Œ ๊ทธ๋ฆผ๋„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ๊ฐ€ ํฌํ•จ๋œ ํ•˜๋‚˜์˜ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์†”๋ฃจ์…˜์ด ์žˆ์—ˆ๊ณ  ๊ฐ ํ”„๋กœ์ ํŠธ๋Š” ๋ฌธ์ž์—ด ๋น„๊ต๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฌด์—‡์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ ์–ด๋–ป๊ฒŒ ํ†ตํ•ฉํ•ด์•ผ ํ• ๊นŒ์š”? Richter์˜ C#์„ ํ†ตํ•œ CLR ์ฑ…์—์„œ ToUpperInvariant() ๋ฉ”์„œ๋“œ๊ฐ€ ToLowerInvariant()๋ณด๋‹ค ๋น ๋ฅด๋‹ค๋Š” ์ •๋ณด๋ฅผ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.

์ฑ…์—์„œ ๋ฐœ์ทŒ:

.NET Core์˜ ์„ฑ๋Šฅ

๋ฌผ๋ก  ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ฏฟ์ง€ ์•Š์•˜๊ณ  .NET Framework์—์„œ ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์œผ๋ฉฐ ๊ทธ ๊ฒฐ๊ณผ๋Š” ์ถฉ๊ฒฉ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์ด 15% ์ด์ƒ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๋‚  ์•„์นจ ์ถœ๊ทผํ•˜์ž๋งˆ์ž ์ด ์ธก์ •๊ฐ’์„ ์ƒ์‚ฌ์—๊ฒŒ ๋ณด์—ฌ์ฃผ๊ณ  ์†Œ์Šค ์ฝ”๋“œ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ 2๊ฐœ์˜ ํ”„๋กœ์ ํŠธ ์ค‘ 14๊ฐœ์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ƒˆ๋กœ์šด ์ธก์ •์„ ์ˆ˜์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฉฐ, ์ด ๋‘ ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ฑฐ๋Œ€ํ•œ Excel ํ…Œ์ด๋ธ”์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ–ˆ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ์ œํ’ˆ์— ์žˆ์–ด์„œ๋Š” ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ํ›จ์”ฌ ์ปธ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์—ฌ๋Ÿฌ๋ถ„ ๊ฐ์ž๊ฐ€ ๊ฐ€์žฅ ์ตœ์ ์˜ ์†”๋ฃจ์…˜์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์–‘ํ•œ ๋ฒ„์ „์˜ .NET Core์— ๋Œ€ํ•œ ์ธก์ •๊ฐ’๋„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ œ๊ฐ€ ์ผํ•˜๋Š” ํšŒ์‚ฌ์—์„œ๋Š” ToUpper()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ๋น„๊ตํ•œ๋‹ค๋Š” ์ ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์•”ํ˜ธ:

public const string defaultString =  "VXTDuob5YhummuDq1PPXOHE4PbrRjYfBjcHdFs8UcKSAHOCGievbUItWhU3ovCmRALgdZUG1CB0sQ4iMj8Z1ZfkML2owvfkOKxBCoFUAN4VLd4I8ietmlsS5PtdQEn6zEgy1uCVZXiXuubd0xM5ONVZBqDu6nOVq1GQloEjeRN8jXrj0MVUexB9aIECs7caKGddpuut3";

        [Benchmark]
        public bool ToLower()
        {
            return defaultString.ToLower() == defaultString.ToLower();
        }

        [Benchmark]
        public bool ToLowerInvariant()
        {
            return defaultString.ToLowerInvariant() == defaultString.ToLowerInvariant();
        }

        [Benchmark]
        public bool ToUpper()
        {
            return defaultString.ToUpper() == defaultString.ToUpper();
        }

        [Benchmark]
        public bool ToUpperInvariant()
        {
            return defaultString.ToUpperInvariant() == defaultString.ToUpperInvariant();
        }

.NET Core์˜ ์„ฑ๋Šฅ

.NET Core์˜ ์„ฑ๋Šฅ

.NET Core 3.0์—์„œ ์ด๋Ÿฌํ•œ ๊ฐ ๋ฉ”์„œ๋“œ์˜ ์ฆ๊ฐ€๋Š” ~x2์ด๋ฉฐ ๊ตฌํ˜„ ๊ฐ„์˜ ๊ท ํ˜•์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

.NET Core์˜ ์„ฑ๋Šฅ

.NET Core์˜ ์„ฑ๋Šฅ

๊ณ„์ธต ์ปดํŒŒ์ผ

์ง€๋‚œ ๊ธฐ์‚ฌ์—์„œ ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ–ˆ๋Š”๋ฐ, ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•˜๊ณ  ๋ณด์™„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‹ค์ค‘ ๋ ˆ๋ฒจ ์ปดํŒŒ์ผ์€ ์†”๋ฃจ์…˜์˜ ์‹œ์ž‘ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜์ง€๋งŒ ์ฝ”๋“œ์˜ ์ผ๋ถ€๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ณด๋‹ค ์ตœ์ ํ™”๋œ ๋ฒ„์ „์œผ๋กœ ์ปดํŒŒ์ผ๋˜๋ฏ€๋กœ ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. NET Core 3.0์˜ ์ถœํ˜„์œผ๋กœ ๊ณ„์ธต ์ปดํŒŒ์ผ์ด ํ™œ์„ฑํ™”๋œ ํ”„๋กœ์ ํŠธ์˜ ๋นŒ๋“œ ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋˜์—ˆ์œผ๋ฉฐ ์ด ๊ธฐ์ˆ ๊ณผ ๊ด€๋ จ๋œ ๋ฒ„๊ทธ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ์ด ๊ธฐ์ˆ ๋กœ ์ธํ•ด ASP.NET Core์˜ ์ฒซ ๋ฒˆ์งธ ์š”์ฒญ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ  ๋‹ค์ค‘ ๋ ˆ๋ฒจ ์ปดํŒŒ์ผ ๋ชจ๋“œ์—์„œ ์ฒซ ๋ฒˆ์งธ ๋นŒ๋“œ ์ค‘์— ์ž‘๋™์ด ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ .NET Core 3.0์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์ง€๋งŒ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ€์žฅ, ์„ ๋ฐฐ, ์ค‘๊ฐ„, ๋ถ€์„œ์žฅ์ด๋ผ๋ฉด ์‹ ์†ํ•œ ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ์ด ํŒ€์˜ ๊ฐ€์น˜๋ฅผ ๋†’์ด๊ณ , ์ด ๊ธฐ์ˆ ์„ ํ†ตํ•ด ๋‘ ๊ฐœ๋ฐœ์ž ๋ชจ๋‘์˜ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์ ํŠธ ์ž์ฒด์˜ ์‹œ๊ฐ„.

.NET ๋ ˆ๋ฒจ ์—…

.NET Framework/.NET Core ๋ฒ„์ „์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์„ธ์š”. ์ƒˆ๋กœ์šด ๋ฒ„์ „์ด ๋‚˜์˜ฌ ๋•Œ๋งˆ๋‹ค ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ •ํ™•ํžˆ ์–ด๋–ค ์ด์ ์ด ์žˆ๋‚˜์š”? ๊ทธ ์ค‘ ์ผ๋ถ€๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

  • .NET Core 3.0์—๋Š” .NET Core ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹œ์ž‘ ์‹œ๊ฐ„์„ ์ค„์ด๋Š” R2R ์ด๋ฏธ์ง€๊ฐ€ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฒ„์ „ 2.2์—์„œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์„ ์ค„์—ฌ์ฃผ๋Š” Tier Compilation์ด ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด .NET ํ‘œ์ค€์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์ตœ์ ํ™”, ์ƒˆ ๋ฒ„์ „์ด ๋‚˜์˜ฌ ๋•Œ๋งˆ๋‹ค ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Collection/Struct/Stream/String/Regex ๋“ฑ์˜ ์ตœ์ ํ™”๊ฐ€ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. .NET Framework์—์„œ .NET Core๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ฆ‰์‹œ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, .NET Core 3.0์— ์ถ”๊ฐ€๋œ ์ผ๋ถ€ ์ตœ์ ํ™”์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ์ฒจ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-core-3-0/

.NET Core์˜ ์„ฑ๋Šฅ

๊ฒฐ๋ก 

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

๊นƒํ—ˆ๋ธŒ์— ๋งํฌ

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€