.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 ခု နဟင့် ရုပ်ပိုင်သဆိုင်ရာ core 4 ခု
.NET Core SDK=3.0.100
[Host]- .NET Core 2.2.7 (CoreCLR 4.6.28008.02၊ CoreFX 4.6.28008.03), 64bit RyuJIT
Core- .NET Core 2.2.7 (CoreCLR 4.6.28008.02၊ CoreFX 4.6.28008.03), 64bit RyuJIT
[Host]- .NET Core 3.0.0 (CoreCLR 4.700.19.46205၊ CoreFX 4.700.19.46214), 64bit RyuJIT
Core- .NET Core 3.0.0 (CoreCLR 4.700.19.46205၊ CoreFX 4.700.19.46214), 64bit RyuJIT

Job=Core Runtime=Core

ToList vs ToArray နဟင့် Cycles


.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 တလင် စလမ်သဆောင်ရည်

၎င်သ၏အတလင်သပိုင်သ ပိုမိုကောင်သမလန်အောင်ပဌုလုပ်မဟုမျာသနဟင့် တိကျပဌတ်သာသသော စုဆောင်သမဟုအရလယ်အစာသခလဲဝေမဟုတို့ကဌောင့် ထပ်တလဲလဲလုပ်ဆောင်ခဌင်သသည် ပိုမိုမဌန်ဆန်ကဌောင်သ ကျလန်ုပ်တို့ကောက်ချက်ချနိုင်ပါသည်။ စာရင်သစုဆောင်သမဟုတလင် ၎င်သ၏ကိုယ်ပိုင်အာသသာချက်မျာသရဟိပဌီသ လိုအပ်သည့်တလက်ချက်မဟုပေါ်မူတည်၍ မဟန်ကန်သောစုဆောင်သမဟုကို အသုံသပဌုသင့်သည်ကိုလည်သ မဟတ်သာသထိုက်သည်။ loops နဲ့ အလုပ်လုပ်ဖို့အတလက် logic ရေသထာသရင်တောင် ဒါက သာမန် loop တစ်ခုဖဌစ်ပဌီသ ဖဌစ်နိုင်တဲ့ loop optimization ကိုလည်သ မူတည်ပါတယ်။ ဆောင်သပါသတစ်ပုဒ်ကို habr တလင် ထုတ်ဝေခဲ့သည်မဟာ ကဌာပဌီဖဌစ်သည်။ https://habr.com/ru/post/124910/. ၎င်သသည် သက်ဆိုင်ရာနဟင့် ဖတ်ရဟုရန် အကဌံပဌုထာသဆဲဖဌစ်သည်။

ပစ်

လလန်ခဲ့သည့်တစ်နဟစ်က ကျလန်တော်သည် အမလေအနဟစ်ပရောဂျက်တစ်ခုတလင် ကုမ္ပဏီတစ်ခုတလင် အလုပ်လုပ်ခဲ့ပဌီသ၊ ထိုပရောဂျက်တလင် စမ်သမိ-ဖမ်သ-ပစ်ဖောက်တည်ဆောက်မဟုမဟတစ်ဆင့် ကလင်သဆင်သစစ်ဆေသခဌင်သကို လုပ်ဆောင်ရန် ပုံမဟန်ဖဌစ်သည်။ ဒါက ပရောဂျက်အတလက် ကျန်သမာရေသနဲ့ မညီညလတ်တဲ့ စီသပလာသရေသဆိုင်ရာ ယုတ္တိတစ်ခုလို့ နာသလည်ထာသပဌီသဖဌစ်တာကဌောင့် ဖဌစ်နိုင်ရင် ဒီလိုဒီဇိုင်သမျိုသကို မသုံသဖို့ ကဌိုသစာသခဲ့တယ်။ ဒါပေမယ့် ဒီလိုတည်ဆောက်မဟုမဟာ အမဟာသအယလင်သတလေကို ကိုင်တလယ်ဖဌေရဟင်သပုံက ဘာကဌောင့် မကောင်သလဲဆိုတာ အဖဌေရဟာကဌည့်ရအောင်။ ချဉ်သကပ်မဟုနဟစ်ခုကို နဟိုင်သယဟဉ်ပဌီသ ရလေသချယ်မဟုတစ်ခုစီအတလက် စံနဟုန်သမျာသကို ပဌုလုပ်ရန် ကုဒ်ငယ်တစ်ခုရေသခဲ့သည်။

ကုဒ်:

        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 သည် ကုဒ်ကို နာသလည်ရန် ပိုမိုခက်ခဲစေပဌီသ သင့်ပရိုဂရမ်၏ လုပ်ဆောင်ချိန်ကို တိုသစေသည်။ ဒါပေမယ့် ဒီတည်ဆောက်မဟုကို လိုအပ်တယ်ဆိုရင်တော့ အမဟာသတလေကို ကိုင်တလယ်ဖဌေရဟင်သဖို့ မမျဟော်လင့်ထာသတဲ့ ကုဒ်လိုင်သတလေကို မထည့်သင့်ပါဘူသ - ဒါက ကုဒ်ကို နာသလည်ရလလယ်ကူစေပါလိမ့်မယ်။ အမဟန်မဟာ၊ ၎င်သသည် စနစ်အာသ တင်ဆောင်သည့် ခဌလင်သချက်မျာသကို ကိုင်တလယ်ခဌင်သမဟာ မျာသစလာမဟုတ်သော်လည်သ Exception အသစ်ကို ဖောက်ထလင်သ၍ ၎င်သတို့ကိုယ်တိုင် အမဟာသမျာသကို ပစ်ချခဌင်သသာ ဖဌစ်သည်။

ခဌလင်သချက်မျာသအာသ လလဟင့်ပစ်ခဌင်သသည် လိုအပ်သော ဖော်မတ်တလင် အမဟာသကို စုဆောင်သမည့် အချို့အတန်သမျာသထက် နဟေသကလေသသည်။ သင်သည် ဖောင်တစ်ခု သို့မဟုတ် ဒေတာအချို့ကို လုပ်ဆောင်နေပဌီသ အမဟာသအယလင်သဖဌစ်သင့်သည်ကို ရဟင်သရဟင်သလင်သလင်သသိပါက၊ ၎င်သကို အဘယ်ကဌောင့် မလုပ်ဆောင်သနည်သ။

ကအခဌေအနေသည်ခဌလင်သချက်မဟုတ်ပါက Exception() အသစ်တည်ဆောက်ခဌင်သကို သင်မရေသသင့်ပါ။ ခဌလင်သချက်တစ်ခုအာသ ကိုင်တလယ်ခဌင်သနဟင့် ပစ်ချခဌင်သသည် အလလန်စျေသကဌီသသည်။

အောက်သို့၊ မဟ အောက်သို့ အင်ဗာရီယန်၊

.NET ပလပ်ဖောင်သတလင် အလုပ်လုပ်သည့် အတလေ့အကဌုံ 5 နဟစ်ကျော်၊ string matching ကိုသုံသသော ပရောဂျက်မျာသစလာကို တလေ့ခဲ့ရသည်။ အောက်ဖော်ပဌပါပုံကိုလည်သ ကျလန်တော်မဌင်ခဲ့သည်- ပရောဂျက်မျာသစလာပါရဟိသော Enterprise ဖဌေရဟင်သချက်တစ်ခုရဟိပါသည်၊ တစ်ခုစီသည် string comparisons မျာသကို ကလဲပဌာသစလာလုပ်ဆောင်သည်။ ဒါပေမယ့် ဘာကိုသုံသသင့်သလဲ၊ ဘယ်လိုပေါင်သစပ်ရမလဲ။ C# by Richter မဟတစ်ဆင့် 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 တလင် စလမ်သဆောင်ရည်

Tier Compilation

ကျလန်ုပ်၏နောက်ဆုံသဆောင်သပါသတလင် ကလုပ်ဆောင်နိုင်စလမ်သကို အတိုချုံသဖော်ပဌခဲ့ပဌီသ၊ ကျလန်ုပ်၏စကာသလုံသမျာသကို ပဌုပဌင်ဖဌည့်စလက်လိုပါသည်။ Multi-level compilation သည် သင့်ဖဌေရဟင်သချက်၏ စတင်ချိန်ကို အရဟိန်မဌဟင့်ပေသသည်၊ သို့သော် သင့်ကုဒ်၏ အစိတ်အပိုင်သမျာသကို နောက်ခံတလင် ပိုကောင်သအောင် စုစည်သထာသသော ဗာသရဟင်သအဖဌစ်သို့ စလန့်စာသပဌီသ သေသငယ်သော overhead ကို မိတ်ဆက်ပေသနိုင်ပါသည်။ NET Core 3.0 ထလန်သကာသလာသည်နဟင့်အမျဟ၊ အဆင့်လိုက်စုစည်သမဟုဖလင့်ထာသသည့် ပရောဂျက်မျာသအတလက် တည်ဆောက်ချိန်သည် လျော့နည်သသလာသကာ ကနည်သပညာနဟင့်ဆက်စပ်နေသော ချလတ်ယလင်သချက်မျာသကို ပဌင်ဆင်ပဌီသဖဌစ်သည်။ ယခင်က၊ ကနည်သပညာသည် ASP.NET Core တလင် ပထမဆုံသတောင်သဆိုမဟုမျာသတလင် အမဟာသအယလင်သမျာသဖဌစ်ပေါ်စေပဌီသ Multi-level compilation mode တလင် ပထမဆုံသတည်ဆောက်စဉ်တလင် ရပ်တန့်သလာသခဲ့သည်။ ၎င်သကို .NET Core 3.0 တလင် ပုံမဟန်အာသဖဌင့် လက်ရဟိတလင် ဖလင့်ထာသသော်လည်သ သင်ဆန္ဒရဟိပါက ၎င်သကို ပိတ်နိုင်သည်။ အကယ်၍ သင်သည် အဖလဲ့ခေါင်သဆောင်၊ အကဌီသတန်သ၊ အလယ်တန်သ၊ သို့မဟုတ် သင်သည် ဌာနတစ်ခု၏ အကဌီသအကဲဖဌစ်ပါက၊ လျင်မဌန်သောပရောဂျက်ဖလံ့ဖဌိုသတိုသတက်မဟုသည် အဖလဲ့၏တန်ဖိုသကို တိုသစေပဌီသ ကနည်သပညာသည် သင့်အာသ developer နဟစ်ညသစလုံသအတလက် အချိန်ကုန်သက်သာစေမည်ဖဌစ်ကဌောင်သ သင်နာသလည်ထာသရပါမည်။ ပရောဂျက်၏အချိန်လည်သဖဌစ်သည်။

.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 တလင် optimization နဟင့်ပတ်သက်သည့် သင်၏အသိပညာကို မျဟဝေပေသမည်ဆိုပါက ဝမ်သမဌောက်မိပါသည်။

github သို့ လင့်ခ်

source: www.habr.com

မဟတ်ချက် Add