Иҷрои кор дар .NET Core

Иҷрои кор дар .NET Core

Иҷрои кор дар .NET Core

Салом ба ҳама! Ин мақола маҷмӯи таҷрибаҳои беҳтаринест, ки ман ва ҳамкорони ман муддати тӯлонӣ ҳангоми кор дар лоиҳаҳои гуногун истифода мебарем.

Маълумот дар бораи мошине, ки дар он ҳисобҳо анҷом дода шудаанд:BenchmarkDotNet = v0.11.5, OS = Windows 10.0.18362
Intel Core i5-8250U CPU 1.60 ГГц (Kaby Lake R), 1 CPU, 8 мантиқӣ ва 4 ядрои физикӣ
.NET Core SDK = 3.0.100
[Хаст]: .NET Core 2.2.7 (CoreCLR 4.6.28008.02, CoreFX 4.6.28008.03), 64bit RyuJIT
Асосӣ: .NET Core 2.2.7 (CoreCLR 4.6.28008.02, CoreFX 4.6.28008.03), 64bit RyuJIT
[Хаст]: .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT
Асосӣ: .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT

Кор = Вақти асосии кор = Асосӣ

ToList против 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

Мо метавонем ба хулосае ояд, ки коркарди такрории коллексияи Array аз сабаби оптимизатсияи дохилии он ва тақсимоти дақиқи андозаи коллексия тезтар аст. Инчунин бояд дар хотир дошт, ки коллексияи Рӯйхат бартариҳои худро дорад ва шумо бояд вобаста ба ҳисобҳои зарурӣ коллексияи дурустро истифода баред. Ҳатто агар шумо мантиқро барои кор бо ҳалқаҳо нависед, фаромӯш накунед, ки ин як ҳалқаи оддӣ аст ва он инчунин ба оптимизатсияи имконпазири давр вобаста аст. Дере нагузашта дар habr мақолае нашр шуда буд: https://habr.com/ru/post/124910/. Он то ҳол муҳим аст ва хондан тавсия дода мешавад.

Тарк кунед

Як сол пеш, ман дар як ширкат дар як лоиҳаи меросӣ кор мекардам, дар он лоиҳа коркарди санҷиши саҳро тавассути конструксияи 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

Кӯшиш кунед, ки catch фаҳмидани кодро душвортар мекунад ва вақти иҷрои барномаи шуморо зиёд мекунад. Аммо агар ба шумо ин сохтмон лозим бошад, шумо набояд он сатрҳои кодро ворид кунед, ки интизори хатогиҳо нестанд - ин фаҳмидани кодро осонтар мекунад. Дарвоқеъ, на он қадар коркарди истисноҳо системаро бор мекунад, балки худи партофтани хатогиҳо тавассути сохтори нави Exception партофт.

Партофтани истисноҳо нисбат ба баъзе синфҳо сусттар аст, ки хатогиро дар формати зарурӣ ҷамъоварӣ мекунад. Агар шумо форма ё баъзе маълумотро коркард карда истода бошед ва шумо аниқ медонед, ки хато чӣ гуна бояд бошад, чаро онро коркард накунед?

Шумо набояд сохти нави Exception()-ро нависед, агар ин вазъият истисноӣ набошад. Муносибат ва партофтани истисно хеле гарон аст!!!

ToLower, ToLowerInvariant, ToUpper, ToUpperInvariant

Дар тӯли 5 соли таҷрибаи кор дар платформаи .NET, ман бо бисёр лоиҳаҳое дучор омадам, ки мувофиқати сатрро истифода мебаранд. Ман инчунин тасвири зеринро дидам: як ҳалли Enterprise бо лоиҳаҳои зиёд мавҷуд буд, ки ҳар яки онҳо муқоисаи сатрро ба таври гуногун иҷро мекарданд. Аммо чӣ бояд истифода шавад ва чӣ гуна онро муттаҳид кард? Дар китоби CLR тавассути C # аз ҷониби Рихтер, ман маълумотеро хондам, ки усули 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 тасвирҳои R2R-ро муаррифӣ кард, ки вақти оғози барномаҳои .NET Coreро кам мекунад.
  • Бо версияи 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 мубодила кунед, ман шод мешудам.

Истинод ба github

Манбаъ: will.com

Илова Эзоҳ