Kinerja ing .NET Core

Kinerja ing .NET Core

Kinerja ing .NET Core

Halo kabeh! Artikel iki minangka kumpulan Praktik Paling Apik sing wis saya gunakake lan kanca-kancaku nalika nggarap proyek sing beda-beda.

Informasi babagan mesin sing etungan ditindakake:BenchmarkDotNet=v0.11.5, OS=Windows 10.0.18362
Intel Core i5-8250U CPU 1.60GHz (Kaby Lake R), 1 CPU, 8 logis lan 4 inti fisik
.NET inti SDK=3.0.100
[Host]: .NET Core 2.2.7 (CoreCLR 4.6.28008.02, CoreFX 4.6.28008.03), 64bit RyuJIT
Inti: .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
Inti: .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT

Job=Inti Runtime=Inti

ToList vs ToArray lan Siklus


Aku ngrancang kanggo nyiapake informasi iki kanthi release .NET Core 3.0, nanging dheweke ngalahake aku, aku ora pengin nyolong kamulyan wong liya lan nyalin informasi wong liya, mula aku mung nuduhake. pranala menyang artikel apik ngendi comparison diterangake ing rinci.

Atas jenenge dhewe, aku mung pengin menehi pangukuran lan asil; Aku nambahake puteran mbalikke kanggo para penyayang "gaya C ++" puteran nulis.

kode:

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

Kecepatan kinerja ing .NET inti 2.2 lan 3.0 meh padha. Mangkene apa sing dakkarepake ing .NET Core 3.0:

Kinerja ing .NET Core

Kinerja ing .NET Core

Kita bisa nyimpulake manawa pangolahan iteratif koleksi Array luwih cepet amarga optimasi internal lan alokasi ukuran koleksi sing jelas. Sampeyan uga kudu eling yen koleksi List duwe kaluwihan dhewe lan sampeyan kudu nggunakake koleksi sing tepat gumantung saka petungan sing dibutuhake. Sanajan sampeyan nulis logika kanggo nggarap loop, aja lali yen iki minangka loop biasa lan uga tundhuk optimasi loop. Artikel wis diterbitake ing habr cukup suwe: https://habr.com/ru/post/124910/. Iku isih relevan lan dianjurake kanggo maca.

thrower

Setaun kepungkur, aku kerja ing perusahaan ing proyek warisan, ing proyek kasebut normal kanggo ngolah validasi lapangan liwat konstruksi try-catch-throw. Aku wis ngerti yen iki minangka logika bisnis sing ora sehat kanggo proyek kasebut, mula aku nyoba ora nggunakake desain kasebut. Nanging ayo ngerteni kenapa pendekatan kanggo nangani kesalahan karo konstruksi kasebut ala. Aku nulis kode cilik kanggo mbandhingake loro pendekatan lan nggawe pathokan kanggo saben pilihan.

kode:

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

Asil ing .NET Core 3.0 lan Core 2.2 duwe asil sing padha (.NET Core 3.0):

Kinerja ing .NET Core

Kinerja ing .NET Core

Coba nyekel nggawe kode luwih angel dingerteni lan nambah wektu eksekusi program sampeyan. Nanging yen sampeyan butuh konstruksi iki, sampeyan ora kudu nglebokake baris kode sing ora dikarepake kanggo ngatasi kesalahan - iki bakal nggawe kode luwih gampang dingerteni. Ing kasunyatan, iku ora dadi luwih nangani istiméwa sing mbukak sistem, nanging mbuwang kesalahane dhewe liwat uncalan pangecualian mbangun anyar.

Pengecualian mbuwang luwih alon tinimbang sawetara kelas sing bakal ngumpulake kesalahan ing format sing dibutuhake. Yen sampeyan ngolah formulir utawa sawetara data lan sampeyan ngerti kanthi jelas apa kesalahane, kenapa ora diproses?

Sampeyan ora kudu nulis uncalan Istiméwa anyar () mbangun yen kahanan iki ora ngédap. Nangani lan mbuwang pengecualian larang banget !!!

ToLower, ToLowerInvariant, ToUpper, ToUpperInvariant

Swara 5 taun pengalaman nggarap platform .NET, aku wis nemokake akeh proyek sing nggunakake pencocokan senar. Aku uga weruh gambar ing ngisor iki: ana siji solusi Enterprise karo akeh proyek, saben kang nindakake bandingaken senar beda. Nanging apa sing kudu digunakake lan carane nggabungake? Ing buku CLR liwat C # dening Richter, Aku maca informasi sing ToUpperInvariant () cara luwih cepet saka ToLowerInvariant ().

Kutipan saka buku:

Kinerja ing .NET Core

Mesthi, aku ora pracaya lan mutusaké kanggo mbukak sawetara tes banjur ing .NET Framework lan asil cingak kula - luwih saka 15% nambah kinerja. Banjur, nalika teka ing kantor esuk, aku nuduhake pangukuran kasebut marang atasanku lan menehi akses menyang kode sumber. Sawise iki, 2 saka 14 proyek diganti kanggo nampung pangukuran anyar, lan ngelingi yen loro proyek kasebut ana kanggo ngolah tabel Excel sing gedhe, asil kasebut luwih penting kanggo produk kasebut.

Aku uga menehi pangukuran kanggo macem-macem versi .NET Core, supaya saben sampeyan bisa milih solusi sing paling optimal. Lan aku mung pengin nambah ing perusahaan ngendi aku bisa, kita nggunakake ToUpper () kanggo strings mbandhingaké.

kode:

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

Kinerja ing .NET Core

Kinerja ing .NET Core

Ing .NET Core 3.0, paningkatan kanggo saben metode kasebut yaiku ~x2 lan ngimbangi implementasine ing antarane.

Kinerja ing .NET Core

Kinerja ing .NET Core

Kompilasi Tier

Ing artikel pungkasan, aku nerangake fungsi iki kanthi ringkes, aku pengin mbenerake lan nambah tembungku. Kompilasi multi-tingkat nyepetake wektu wiwitan solusi sampeyan, nanging sampeyan kurban bagean kode sampeyan bakal dikompilasi menyang versi sing luwih optimized ing latar mburi, sing bisa ngenalake overhead cilik. Kanthi tekane NET Core 3.0, wektu mbangun kanggo proyek kanthi kompilasi tingkatan wis suda lan bug sing ana gandhengane karo teknologi iki wis didandani. Sadurunge, teknologi iki nyebabake kesalahan ing panjalukan pisanan ing ASP.NET Core lan beku nalika mbangun pisanan ing mode kompilasi multi-level. Saiki diaktifake kanthi gawan ing .NET Core 3.0, nanging sampeyan bisa mateni yen pengin. Yen sampeyan ana ing posisi pimpinan tim, senior, tengah, utawa sampeyan minangka kepala departemen, mula sampeyan kudu ngerti manawa pangembangan proyek kanthi cepet nambah nilai tim lan teknologi iki bakal ngidini sampeyan ngirit wektu kanggo loro pangembang. lan wektu proyek kasebut dhewe.

.NET tingkat munggah

Nganyarke versi .NET Framework / .NET Core sampeyan. Asring, saben versi anyar menehi hasil kinerja tambahan lan nambah fitur anyar.

Nanging apa sejatine keuntungane? Ayo ndeleng sawetara:

  • .NET Core 3.0 ngenalaken gambar R2R sing bakal nyuda wektu wiwitan aplikasi .NET Core.
  • Kanthi versi 2.2, Kompilasi Tier muncul, amarga programer bakal mbuwang wektu luwih sithik kanggo ngluncurake proyek.
  • Dhukungan kanggo .NET Standards anyar.
  • Dhukungan kanggo versi anyar saka basa pamrograman.
  • Optimization, karo saben versi anyar Optimization saka perpustakaan dhasar Koleksi / Struct / Stream / String / Regex lan akeh liyane mbenakake. Yen sampeyan pindhah saka .NET Framework menyang .NET Core, sampeyan bakal entuk peningkatan kinerja sing gedhe. Minangka conto, aku masang link menyang sawetara optimasi sing ditambahake menyang .NET Core 3.0: https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-core-3-0/

Kinerja ing .NET Core

kesimpulan

Nalika nulis kode, sampeyan kudu menehi perhatian marang macem-macem aspek proyek sampeyan lan nggunakake fitur basa program lan platform kanggo entuk asil sing paling apik. Aku bakal bungah yen sampeyan nuduhake kawruh related kanggo optimasi ing .NET.

Link menyang github

Source: www.habr.com

Add a comment