Ukusebenza ku-.NET Core

Ukusebenza ku-.NET Core

Ukusebenza ku-.NET Core

Sanibonani nonke! Lesi sihloko siyiqoqo Lemikhuba Engcono Kakhulu mina nozakwethu ebesilokhu siyisebenzisa isikhathi eside lapho sisebenza kumaphrojekthi ahlukene.

Ulwazi mayelana nomshini lapho izibalo zenziwa khona:I-BenchmarkDotNet=v0.11.5, OS=Windows 10.0.18362
I-Intel Core i5-8250U CPU 1.60GHz (Kaby Lake R), 1 CPU, 8 okunengqondo kanye 4 cores ngokomzimba
.NET Core SDK=3.0.100
[Umsingathi]: .NET Core 2.2.7 (CoreCLR 4.6.28008.02, CoreFX 4.6.28008.03), 64bit RyuJIT
Ingqikithi: .NET Core 2.2.7 (CoreCLR 4.6.28008.02, CoreFX 4.6.28008.03), 64bit RyuJIT
[Umsingathi]: .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT
Ingqikithi: .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT

Job=Core Runtime=Core

I-ToList vs ToArray kanye namaCycle


Ngihlele ukulungisa lolu lwazi ngokukhululwa kwe-.NET Core 3.0, kodwa bangishaya, angifuni ukuntshontsha inkazimulo yomunye umuntu futhi ngikopishe ulwazi lwabanye abantu, ngakho ngizovele ngiveze isixhumanisi esihlokweni esihle lapho ukuqhathanisa kuchazwa ngokuningiliziwe.

Ngokwami, ngifuna ukwethula kuwe izilinganiso zami nemiphumela; ngengeze izihibe ezihlehlayo kubo kubathandi "besitayela se-C++" sokubhala amaluphu.

Ikhodi:

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;
        }
    }

Izivinini zokusebenza ku-.NET Core 2.2 naku-3.0 zicishe zifane. Nakhu engikwazile ukukuthola ku-NET Core 3.0:

Ukusebenza ku-.NET Core

Ukusebenza ku-.NET Core

Singaphetha ngokuthi ukucutshungulwa okuphindaphindwayo kweqoqo le-Array kuyashesha ngenxa yokulungiselelwa kwangaphakathi nokwabiwa kosayizi weqoqo okusobala. Kuhle futhi ukukhumbula ukuthi iqoqo Lohlu linezinzuzo zalo futhi kufanele usebenzise iqoqo elifanele kuye ngezibalo ezidingekayo. Ngisho noma ubhala i-logic yokusebenza ngamalophu, ungakhohlwa ukuthi lena iluphu evamile futhi ingaphansi kokwenziwa ngcono kwe-loop. Indatshana yashicilelwa ku-habr kudala kakhulu: https://habr.com/ru/post/124910/. Kusafanele futhi kunconywe ukufunda.

Phonsa

Ngonyaka odlule, ngasebenza enkampanini kuphrojekthi yefa, kuleyo phrojekthi kwakuyinto evamile ukucubungula ukuqinisekiswa kwenkundla ngokwakhiwa kokuzama ukubamba-phonsela. Ngase ngiqonda ngaleso sikhathi ukuthi lokhu kwakuwukucabanga kwebhizinisi okungenampilo kuphrojekthi, ngakho noma nini lapho kunokwenzeka ngangizama ukungawusebenzisi umklamo onjalo. Kodwa ake sithole ukuthi kungani indlela yokusingatha amaphutha ngokwakhiwa okunjalo imbi. Ngabhala ikhodi encane ukuze ngiqhathanise lezi zindlela ezimbili futhi ngenza amabhentshimakhi enketho ngayinye.

Ikhodi:

        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;
        }

Imiphumela ku-.NET Core 3.0 naku-Core 2.2 inomphumela ofanayo (.NET Core 3.0):

Ukusebenza ku-.NET Core

Ukusebenza ku-.NET Core

Ukuzama ukubamba kwenza ikhodi kube nzima ukuyiqonda futhi kwandisa isikhathi sokwenza sohlelo lwakho. Kodwa uma udinga lokhu kwakhiwa, akufanele ufake leyo migqa yekhodi okungalindelekile ukuphatha amaphutha - lokhu kuzokwenza ikhodi ibe lula ukuyiqonda. Eqinisweni, akukhona kakhulu ukuphatha okuhlukile okulayisha isistimu, kodwa kunalokho ukujikijelwa kwamaphutha ngokwawo ngokuphonsa okusha kwe-Exception.

Ukulahla okuhlukile kuhamba kancane kunesigaba esithile esizoqoqa iphutha ngefomethi edingekayo. Uma ucubungula ifomu noma idatha ethile futhi wazi ngokucacile ukuthi iphutha kufanele libe yini, kungani ungalicubunguli?

Akufanele ubhale ukwakhiwa okusha kwe-Exception() uma lesi simo singajwayelekile. Ukuphatha nokuphonsa okuhlukile kubiza kakhulu !!!

KuyaPhansi, KwezaPhansiOkungaguqukiyo, Kwephezulu, KwephezuluOkungaguqukiyo

Phakathi neminyaka engu-5 yokuhlangenwe nakho kwami ​​​​ngisebenza kuplathifomu ye-.NET, ngihlangabezane namaphrojekthi amaningi asebenzisa ukufanisa izintambo. Ngiphinde ngabona isithombe esilandelayo: bekunesixazululo esisodwa se-Enterprise esinamaphrojekthi amaningi, ngalinye lenza ukuqhathanisa kwezintambo ngendlela ehlukile. Kodwa yini okufanele isetshenziswe futhi kanjani ukuyihlanganisa? Encwadini ethi CLR nge-C# ka-Richter, ngifunde ulwazi lokuthi indlela ye-ToUpperInvariant() ishesha kune-ToLowerInvariant().

Ingcaphuno evela encwadini:

Ukusebenza ku-.NET Core

Yebo, angikholwanga futhi nganquma ukwenza ezinye izivivinyo ngaleso sikhathi ku-.NET Framework futhi umphumela wangishaqisa - ukwanda kokusebenza okungaphezu kuka-15%. Khona-ke, lapho ngifika emsebenzini ngakusasa ekuseni, ngabonisa lezi zilinganiso kubaphathi bami futhi ngabanikeza ukufinyelela ekhodini yomthombo. Ngemva kwalokhu, amaphrojekthi angu-2 kwangu-14 ashintshiwe ukuze abhekane nezilinganiso ezintsha, futhi uma kucatshangelwa ukuthi la maphrojekthi amabili abekhona ukuze kucutshungulwe amathebula amakhulu e-Excel, umphumela wawubaluleke kakhulu kunomkhiqizo.

Ngethula futhi kini izilinganiso zezinguqulo ezihlukene ze-.NET Core, ukuze ngamunye wenu azikhethele isixazululo esingcono kakhulu. Futhi ngifuna ukungeza lokho enkampanini engisebenza kuyo, sisebenzisa i-ToUpper() ukuqhathanisa izintambo.

Ikhodi:

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();
        }

Ukusebenza ku-.NET Core

Ukusebenza ku-.NET Core

Ku-.NET Core 3.0, ukukhuphuka kwalezi zindlela ngayinye kungu-~x2 futhi kulinganisa ukuqaliswa phakathi kwazo.

Ukusebenza ku-.NET Core

Ukusebenza ku-.NET Core

Ukuhlanganiswa kweTier

Esihlokweni sami sokugcina ngichaze lokhu kusebenza kafushane, ngithanda ukulungisa nokufaka amagama ami. Ukuhlanganiswa kwamaleveli amaningi kusheshisa isikhathi sokuqalisa sesixazululo sakho, kodwa udela ukuthi izingxenye zekhodi yakho zizohlanganiswa zibe inguqulo ethuthuke kakhudlwana ngemuva, engathula phezulu okuncane. Ngokufika kwe-NET Core 3.0, isikhathi sokwakha samaphrojekthi ane-tier compilation enikwe amandla sehlile futhi iziphazamisi ezihlobene nalobu buchwepheshe sezilungisiwe. Ngaphambilini, lobu buchwepheshe buholele emaphutheni ezicelweni zokuqala ku-ASP.NET Core futhi bube yiqhwa ngesikhathi sokwakha kokuqala kumodi yokuhlanganisa enamazinga amaningi. Okwamanje inikwe amandla ngokuzenzakalela ku-.NET Core 3.0, kodwa ungayikhubaza uma uthanda. Uma usesimweni somholi weqembu, omkhulu, ophakathi, noma uyinhloko yomnyango, kufanele uqonde ukuthi ukuthuthukiswa kwephrojekthi okusheshayo kukhulisa inani leqembu futhi lobu buchwepheshe buzokuvumela ukuthi wonge isikhathi sabo bobabili abathuthukisi. kanye nesikhathi sephrojekthi ngokwayo.

.NET phezulu

Thuthukisa inguqulo yakho ye-.NET Framework / .NET Core. Ngokuvamile, inguqulo ngayinye entsha inikeza izinzuzo ezengeziwe zokusebenza futhi yengeza izici ezintsha.

Kodwa ziyini izinzuzo ngempela? Ake sibheke ezinye zazo:

  • I-NET Core 3.0 yethule izithombe ze-R2R ezizonciphisa isikhathi sokuqalisa sezinhlelo zokusebenza ze-NET Core.
  • Ngenguqulo engu-2.2, i-Tier Compilation ivele, ngenxa yokuthi abahleli bezinhlelo bazochitha isikhathi esincane bethula iphrojekthi.
  • Ukusekelwa kwe-.NET Standards entsha.
  • Usekelo lwenguqulo entsha yolimi lokuhlela.
  • Ukuthuthukisa, ngenguqulo ngayinye entsha ukuthuthukiswa kwemitapo yolwazi eyisisekelo Ukuqoqwa/Isakhiwo/Ukusakaza/Uchungechunge/i-Regex nokunye okuningi kuyathuthuka. Uma uthutha usuka ku-.NET Framework uya ku-.NET Core, uzothola ukuthuthukiswa okukhulu kokusebenza ngaphandle kwebhokisi. Njengesibonelo, nginamathisela isixhumanisi kokunye ukulungiselelwa okwengezwe ku-.NET Core 3.0: https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-core-3-0/

Ukusebenza ku-.NET Core

isiphetho

Lapho ubhala ikhodi, kufanelekile ukunaka izici ezihlukene zephrojekthi yakho nokusebenzisa izici zolimi lwakho lokuhlela kanye nenkundla ukuze uzuze umphumela ongcono kakhulu. Ngingajabula uma wabelana ngolwazi lwakho oluhlobene nokwenza kahle ku-.NET.

Xhuma ku-github

Source: www.habr.com

Engeza amazwana