په .NET کور کې فعالیت

په .NET کور کې فعالیت

په .NET کور کې فعالیت

سلام و ټولو ته! دا مقاله د غوره عملونو ټولګه ده چې زما همکاران او زه د اوږدې مودې لپاره په مختلفو پروژو کار کولو کې کاروم.

د ماشین په اړه معلومات په کوم کې چې حسابونه ترسره شوي:BenchmarkDotNet=v0.11.5, OS=Windows 10.0.18362
Intel Core i5-8250U CPU 1.60GHz (Kaby Lake R)، 1 CPU، 8 منطقي او 4 فزیکي کورونه
.NET کور SDK=3.0.100
[کوربه]: .NET کور 2.2.7 (CoreCLR 4.6.28008.02، CoreFX 4.6.28008.03)، 64bit RyuJIT
کور: .NET کور 2.2.7 (CoreCLR 4.6.28008.02، CoreFX 4.6.28008.03)، 64bit RyuJIT
[کوربه]: .NET کور 3.0.0 (CoreCLR 4.700.19.46205، CoreFX 4.700.19.46214)، 64bit RyuJIT
کور: .NET کور 3.0.0 (CoreCLR 4.700.19.46205، CoreFX 4.700.19.46214)، 64bit RyuJIT

دنده = کور دوره = کور

ToList vs 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 کور 2.2 او 3.0 کې د فعالیت سرعت نږدې ورته دی. دلته هغه څه دي چې زه یې په .NET کور 3.0 کې ترلاسه کولی شم:

په .NET کور کې فعالیت

په .NET کور کې فعالیت

موږ کولی شو دې پایلې ته ورسیږو چې د سرې ټولګه تکراري پروسس کول د دې داخلي اصلاح او د راټولولو روښانه اندازې تخصیص له امله ګړندي دي. دا هم د یادولو وړ ده چې د لیست ټولګه خپلې ګټې لري او تاسو باید د اړتیا وړ محاسبې پراساس سم ټولګه وکاروئ. حتی که تاسو د لوپونو سره کار کولو لپاره منطق ولیکئ ، مه هیروئ چې دا یو عادي لوپ دی او دا د احتمالي لوپ اصلاح کولو تابع هم دی. څه موده وړاندې په حبر کې یوه مقاله خپره شوې وه: 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 کور 3.0 او کور 2.2 کې پایلې ورته پایلې لري (.NET کور 3.0):

په .NET کور کې فعالیت

په .NET کور کې فعالیت

هڅه وکړئ کیچ د کوډ پوهیدل سختوي او ستاسو د برنامې اجرا کولو وخت زیاتوي. مګر که تاسو دې ساختمان ته اړتیا لرئ، تاسو باید د کوډ هغه لینونه داخل نه کړئ چې تمه نه کیږي د غلطیو اداره کول - دا به د کوډ پوهیدل اسانه کړي. په حقیقت کې ، دا د استثناییاتو اداره کول دومره ندي چې سیسټم باروي ، بلکه د تیرو نوي استثنایی جوړښت له لارې پخپله د غلطیو غورځول دي.

د استثمار غورځول د ځینې ټولګي په پرتله ورو دي چې غلطی به په اړین شکل کې راټول کړي. که تاسو یوه فورمه یا ځینې ډاټا پروسس کوئ او تاسو په روښانه توګه پوهیږئ چې تېروتنه باید څه وي، ولې دا پروسس نه کوئ؟

تاسو باید د غورځولو نوی استثنا () جوړ نه کړئ که چیرې دا وضعیت استثنایی نه وي. د استثنا اداره کول او غورځول خورا ګران دي !!!

ToLower، ToLowerInvariant، ToUpper، ToUpperInvariant

د .NET پلیټ فارم کې د کار کولو زما د 5 کلونو تجربې په جریان کې ، ما په ډیری پروژو کې لیدلی چې د تار میچنګ کارول کیږي. ما لاندې عکس هم ولید: د ډیری پروژو سره یو تصدۍ حل شتون درلود ، چې هر یو یې د سټینګ پرتله کول په مختلف ډول ترسره کړل. مګر څه باید وکارول شي او څنګه یې یوځای کړئ؟ د Richter لخوا د C# له لارې CLR په کتاب کې، ما هغه معلومات ولوستل چې د ToUpperInvariant() میتود د ToLowerInvariant() په پرتله ګړندی دی.

له کتاب څخه اقتباس:

په .NET کور کې فعالیت

البته، ما په دې باور نه و کړی او پریکړه یې وکړه چې ځینې ازموینې ترسره کړم بیا د .NET چوکاټ کې او پایلې یې زه حیران کړم - د 15٪ څخه ډیر فعالیت زیاتوالی. بیا، بل سهار کار ته په رسیدو سره، ما دا اندازه زما لوړ رتبه افسرانو ته وښودله او دوی ته یې د سرچینې کوډ ته لاسرسی ورکړ. له دې وروسته، د 2 پروژو څخه 14 د نوي اندازه کولو لپاره بدل شوي، او په پام کې نیولو سره چې دا دوه پروژې د لوی اکسل میزونو پروسس کولو لپاره شتون لري، پایله یې د محصول لپاره د پام وړ وه.

زه تاسو ته د .NET کور د مختلفو نسخو لپاره اندازه هم وړاندې کوم، نو تاسو هر یو کولی شئ د خورا غوره حل په لور انتخاب وکړئ. او زه یوازې غواړم دا اضافه کړم په هغه شرکت کې چیرې چې زه کار کوم ، موږ د تارونو پرتله کولو لپاره 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 کور کې فعالیت

په .NET کور کې فعالیت

په .NET کور 3.0 کې، د دې میتودونو هر یو لپاره زیاتوالی ~ x2 دی او په خپل منځ کې تطبیقونه توازن کوي.

په .NET کور کې فعالیت

په .NET کور کې فعالیت

ټیر تالیف

زما په وروستۍ مقاله کې ما دا فعالیت په لنډه توګه بیان کړ، زه غواړم خپل ټکي سم او بشپړ کړم. د څو کچې تالیف ستاسو د حل پیل کولو وخت ګړندی کوي ، مګر تاسو قرباني کوئ چې ستاسو د کوډ برخې به په شالید کې په ډیر مطلوب نسخه کې تالیف شي ، کوم چې کولی شي یو کوچنی سر معرفي کړي. د NET Core 3.0 په راتګ سره، د ټایر تالیف فعال شوي پروژو لپاره د جوړولو وخت کم شوی او د دې ټیکنالوژۍ سره تړلې بګونه حل شوي. پخوا، دا ټیکنالوژي د ASP.NET کور کې په لومړیو غوښتنو کې د تېروتنې لامل شوې او د څو کچې تالیف حالت کې د لومړي جوړونې پرمهال کنګل کیږي. دا اوس مهال په .NET Core 3.0 کې د ډیفالټ لخوا فعال شوی، مګر تاسو کولی شئ دا غیر فعال کړئ که تاسو وغواړئ. که تاسو د ټیم مشر، لوړ رتبه، منځني، یا تاسو د یوې څانګې مشر یاست، نو تاسو باید پوه شئ چې د پروژې چټک پرمختګ د ټیم ارزښت زیاتوي او دا ټیکنالوژي به تاسو ته اجازه درکړي چې د دواړو پراختیا کونکو لپاره وخت خوندي کړي. او پخپله د پروژې وخت.

د .NET کچه پورته شوه

خپل .NET چوکاټ / .NET کور نسخه لوړ کړئ. ډیری وختونه، هره نوې نسخه د فعالیت اضافي لاسته راوړنې چمتو کوي او نوي ځانګړتیاوې اضافه کوي.

مګر واقعیا ګټې څه دي؟ راځئ چې ځینې یې وګورو:

  • .NET کور 3.0 د R2R عکسونه معرفي کړل چې د .NET کور غوښتنلیکونو د پیل وخت به کم کړي.
  • د 2.2 نسخه سره، د ټیر تالیف څرګند شو، له دې امله چې پروګرام کونکي به د پروژې په پیل کولو کې لږ وخت تیر کړي.
  • د نوي .NET معیارونو لپاره ملاتړ.
  • د پروګرام کولو ژبې نوې نسخه لپاره ملاتړ.
  • اصلاح کول، د هرې نوې نسخې سره د بیس کتابتونونو ټولګه / جوړښت / سټریم / سټرینګ / ریجیکس اصلاح کول او نور ډیر څه وده کوي. که تاسو د .NET چوکاټ څخه .NET کور ته مهاجرت کوئ، تاسو به د بکس څخه بهر د فعالیت لوی وده ترلاسه کړئ. د مثال په توګه، زه د ځینو اصلاحونو سره یو لینک ضمیمه کوم چې په .NET کور 3.0 کې اضافه شوي: https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-core-3-0/

په .NET کور کې فعالیت

پایلې

کله چې د کوډ لیکلو لپاره، دا ستاسو د پروژې مختلف اړخونو ته د پام وړ ارزښت لري او ستاسو د پروګرام کولو ژبې او پلیټ فارم ځانګړتیاوې په کارولو سره غوره پایلې ترلاسه کوي. زه به خوښ شم که تاسو په .NET کې د اصلاح کولو اړوند خپله پوهه شریکه کړئ.

د ګیتوب سره لینک

سرچینه: www.habr.com

Add a comment