Nkhani yosapambana yokhudza kufulumizitsa kulingalira

Nthawi yomweyo ndifotokoze mutu wa nkhaniyo. Dongosolo loyambirira linali lopereka upangiri wabwino, wodalirika wamomwe mungafulumizitse kugwiritsa ntchito kuwunikira pogwiritsa ntchito chitsanzo chosavuta koma chowona, koma panthawi yoyeserera zidapezeka kuti kusinkhasinkha sikuchedwa monga momwe ndimaganizira, LINQ imachedwa pang'onopang'ono kuposa m'maloto anga owopsa. Koma pamapeto pake zinapezeka kuti ndinalakwitsanso mumiyeso ... Tsatanetsatane wa nkhani ya moyo uno ili pansi pa odulidwa ndi ndemanga. Popeza chitsanzocho ndi chofala kwambiri ndipo chimagwiritsidwa ntchito monga momwe zimakhalira m'makampani, zidakhala zosangalatsa, monga zikuwoneka kwa ine, chisonyezero cha moyo: zotsatira za liwiro la mutu waukulu wa nkhaniyi unali. sizikuwoneka chifukwa chamalingaliro akunja: Moq, Autofac, EF Core ndi ena "mabandi".

Ndinayamba kugwira ntchito motengera nkhaniyi: Chifukwa chiyani Reflection imachedwa

Monga mukuwonera, wolembayo akuwonetsa kugwiritsa ntchito nthumwi zophatikizidwa m'malo motchula mwachindunji njira zamtundu wa chiwonetsero ngati njira yabwino yofulumizitsira ntchitoyo. Pali, ndithudi, kutulutsa kwa IL, koma ndikufuna kupewa, chifukwa iyi ndi njira yogwira ntchito kwambiri yochitira ntchitoyi, yomwe ili ndi zolakwika.

Poganizira kuti nthawi zonse ndakhala ndi lingaliro lofanana pa liwiro la kulingalira, sindinalingalire makamaka kukayikira zomwe wolembayo ananena.

Nthawi zambiri ndimakumana ndi kugwiritsa ntchito malingaliro mopanda nzeru mubizinesi. Mtundu watengedwa. Zambiri zokhudzana ndi katundu zimatengedwa. Njira ya SetValue imatchedwa ndipo aliyense amasangalala. Phindu lafika pagawo lomwe mukufuna, aliyense ali wokondwa. Anthu anzeru kwambiri - okalamba ndi otsogolera gulu - amalemba zowonjezera zawo kuti atsutse, kutengera kugwiritsa ntchito mopanda nzeru kotereku "mapu onse" amtundu wina kupita ku umzake. Chofunika kwambiri ndi ichi: timatenga minda yonse, kutenga katundu wonse, kubwerezanso: ngati mayina a mamembala amtunduwo akugwirizana, timachita SetValue. Nthawi ndi nthawi timapeza zosiyana chifukwa cha zolakwika zomwe sitinapeze katundu wina mwa mitundu, koma ngakhale apa pali njira yotulukira yomwe imapangitsa kuti ntchito ikhale yabwino. Yesani/gwirani.

Ndawonapo anthu akuyambitsanso ma parser ndi mapper popanda kukhala ndi zida zokwanira za momwe makina omwe adabwera patsogolo pawo amagwirira ntchito. Ndawonapo anthu akubisa machitidwe awo opanda nzeru kumbuyo kwa njira, kumbuyo kwa malo, kumbuyo kwa jakisoni, ngati kuti izi zingakhululukire bacchanalia wotsatira. Ndinakweza mphuno yanga mmwamba pazimenezi. M'malo mwake, sindinayeze kutayikira kwenikweni, ndipo, ngati kuli kotheka, ndidangosintha kukhazikitsa kukhala "koyenera" ngati ndingathe kuyikapo. Chifukwa chake, miyeso yoyamba yomwe takambirana pansipa idandisokoneza kwambiri.

Ndikuganiza kuti ambiri a inu, mukuwerenga Richter kapena akatswiri ena oganiza bwino, mwapeza mawu abwino kwambiri oti kuwonetsa mu code ndi chinthu chomwe chimakhudza kwambiri momwe ntchitoyo ikuyendera.

Kuyimba foni kumakakamiza CLR kudutsa pamisonkhano kuti ipeze yomwe ikufuna, kukokera ma metadata awo, kuwasanthula, ndi zina. Kuonjezera apo, kulingalira pamene mukudutsa ndondomeko kumabweretsa kugawidwa kwa kukumbukira kwakukulu. Tikugwiritsa ntchito kukumbukira, CLR imawulula GC ndipo friezes imayamba. Iyenera kukhala yochedwa kwambiri, ndikhulupirireni. Kuchuluka kwa kukumbukira pa maseva amakono opanga kapena makina amtambo sikulepheretsa kuchedwa kwambiri. M'malo mwake, mukakumbukira kwambiri, mumatha KUDZIWA momwe GC imagwirira ntchito. Kulingalira ndi, mwamalingaliro, chiguduli chofiira chowonjezera kwa iye.

Komabe, tonse timagwiritsa ntchito zotengera za IoC ndi mapu amasiku, zomwe zimatengeranso kusinkhasinkha, koma nthawi zambiri palibe mafunso okhudza momwe amagwirira ntchito. Ayi, osati chifukwa kukhazikitsidwa kwa zodalira ndi kuchotsedwa kwa zitsanzo zakunja zocheperako ndikofunikira kwambiri kotero kuti tiyenera kusiya kuchita mulimonse. Chilichonse ndi chosavuta - sichimakhudza kwambiri magwiridwe antchito.

Chowonadi ndi chakuti mafelemu omwe amapezeka kwambiri omwe amachokera ku teknoloji yowonetsera amagwiritsa ntchito mitundu yonse yamatsenga kuti agwire nawo ntchito bwino. Kawirikawiri ichi ndi cache. Nthawi zambiri awa ndi Mawu ndi nthumwi zopangidwa kuchokera ku mtengo wamafotokozedwe. Automapper yomweyo imakhala ndi dikishonale yopikisana yomwe imagwirizana ndi mitundu yokhala ndi magwiridwe antchito omwe amatha kusinthana wina ndi mnzake popanda kuitana chiwonetsero.

Kodi zimenezi zimatheka bwanji? Kwenikweni, izi sizosiyana ndi malingaliro omwe nsanjayo imagwiritsa ntchito kupanga JIT code. Njira ikaitanidwa koyamba, imapangidwa (ndipo, inde, njirayi siyfulumira); pamayitanidwe otsatirawa, kuwongolera kumasamutsidwa ku njira yomwe yapangidwa kale, ndipo sipadzakhala zovuta zazikulu zogwirira ntchito.

Kwa ife, mutha kugwiritsanso ntchito kuphatikiza kwa JIT ndikugwiritsanso ntchito machitidwe ophatikizidwa ndi magwiridwe antchito ofanana ndi anzawo a AOT. Mawu adzatithandiza pankhaniyi.

Mfundo yomwe ikufunsidwayo ikhoza kufotokozedwa mwachidule motere:
Muyenera kusunga zotsatira zomaliza zowonetsera ngati nthumwi yomwe ili ndi ntchito yophatikizidwa. Ndizomvekanso kusunga zinthu zonse zofunika ndi chidziwitso chamtundu m'magawo amtundu wanu, wogwira ntchito, zomwe zimasungidwa kunja kwa zinthuzo.

Pali zomveka mu izi. Kuganiza bwino kumatiuza kuti ngati china chake chitha kulembedwa ndikusungidwa, ndiye kuti chiyenera kuchitidwa.

Kuyang'ana m'tsogolo, ziyenera kunenedwa kuti posungira pogwira ntchito ndi kulingalira kuli ndi ubwino wake, ngakhale simugwiritsa ntchito njira yopangira mawu. Kwenikweni, apa ndikungobwereza malingaliro a wolemba nkhani yomwe ndikulozera pamwambapa.

Tsopano za code. Tiyeni tione chitsanzo chozikidwa pa zowawa zanga zaposachedwa zomwe ndinakumana nazo popanga zazikulu zangongole. Mabungwe onse ndi opeka kotero kuti palibe amene anganene.

Pali china chake. Pakhale Contact. Pali zilembo zokhala ndi thupi lokhazikika, pomwe parser ndi hydrator amapanga kulumikizana komweku. Kalata inafika, tinaiwerenga, kuigawa m'magulu awiri amtengo wapatali, kupanga cholumikizira, ndikusunga mu database.

Ndizoyambira. Tinene kuti wolumikizana naye ali ndi Dzina Lonse, Zaka ndi Foni Yolumikizana. Deta iyi imafalitsidwa mu kalata. Bizinesiyo ikufunanso thandizo kuti lizitha kuwonjezera mwachangu makiyi atsopano opangira mapu azinthu zamagulu awiriawiri m'chikalatacho. Ngati wina watayira mu template kapena ngati musanatulutse m'pofunika kuti muyambe kupanga mapu kuchokera kwa mnzanu watsopano, kusintha mawonekedwe atsopano. Kenako titha kuwonjezera kulumikizana kwa mapu kwatsopano ngati datafix yotsika mtengo. Ndiko kuti, chitsanzo cha moyo.

Timakhazikitsa, kupanga mayeso. Ntchito.

Sindipereka kachidindo: pali magwero ambiri, ndipo amapezeka pa GitHub kudzera pa ulalo kumapeto kwa nkhaniyo. Mutha kuwakweza, kuwazunza mopitilira kudziwika ndikuwayeza, monga momwe zingakhudzire inu. Ndidzangopereka ndondomeko ya njira ziwiri za template zomwe zimasiyanitsa hydrator, yomwe inkayenera kukhala yofulumira, kuchokera ku hydrator, yomwe imayenera kukhala yochedwa.

Malingaliro ake ndi awa: njira ya template imalandira mawiri awiri opangidwa ndi mfundo zoyambira. LINQ wosanjikiza ndi parser ndi mfundo zoyambira za hydrator, zomwe zimapanga pempho kuzomwe zili patsamba ndikufanizira makiyi ndi awiriawiri kuchokera kwa ophatikiza (pazintchitozi pali code popanda LINQ poyerekeza). Kenako, awiriwa amaperekedwa ku njira yayikulu ya hydration ndipo zikhalidwe za awiriwa zimayikidwa kuzinthu zofananira za bungwe.

"Fast" (Prefix Fast in benchmarks):

 protected override Contact GetContact(PropertyToValueCorrelation[] correlations)
        {
            var contact = new Contact();
            foreach (var setterMapItem in _proprtySettersMap)
            {
                var correlation = correlations.FirstOrDefault(x => x.PropertyName == setterMapItem.Key);
                setterMapItem.Value(contact, correlation?.Value);
            }
            return contact;
        }

Monga tikuonera, chosonkhanitsa chokhazikika chokhala ndi setter chimagwiritsidwa ntchito - ma lambda opangidwa omwe amatcha setter entity. Zapangidwa ndi khodi ili:

        static FastContactHydrator()
        {
            var type = typeof(Contact);
            foreach (var property in type.GetProperties())
            {
                _proprtySettersMap[property.Name] = GetSetterAction(property);
            }
        }

        private static Action<Contact, string> GetSetterAction(PropertyInfo property)
        {
            var setterInfo = property.GetSetMethod();
            var paramValueOriginal = Expression.Parameter(property.PropertyType, "value");
            var paramEntity = Expression.Parameter(typeof(Contact), "entity");
            var setterExp = Expression.Call(paramEntity, setterInfo, paramValueOriginal).Reduce();
            
            var lambda = (Expression<Action<Contact, string>>)Expression.Lambda(setterExp, paramEntity, paramValueOriginal);

            return lambda.Compile();
        }

Mwambiri ndi zomveka. Timadutsa m'malo, kupanga nthumwi za iwo omwe amayitana ma seta, ndikuwasunga. Kenako timayimba pakafunika kutero.

"Slow" (Prefix Slow in benchmarks):

        protected override Contact GetContact(PropertyToValueCorrelation[] correlations)
        {
            var contact = new Contact();
            foreach (var property in _properties)
            {
                var correlation = correlations.FirstOrDefault(x => x.PropertyName == property.Name);
                if (correlation?.Value == null)
                    continue;

                property.SetValue(contact, correlation.Value);
            }
            return contact;
        }

Apa timadumphadumpha nthawi yomweyo ndikuyimbira SetValue mwachindunji.

Kuti zimveke bwino komanso ngati zofotokozera, ndidagwiritsa ntchito njira yopanda pake yomwe imalemba zomwe zimalumikizana ndi awiriawiri awo mwachindunji m'magawo. Prefix - Buku.

Tsopano tiyeni titenge BenchmarkDotNet ndikuwona momwe ntchitoyi ikuyendera. Ndipo mwadzidzidzi ... (spoiler - izi sizotsatira zolondola, zambiri zili pansipa)

Nkhani yosapambana yokhudza kufulumizitsa kulingalira

Kodi tikuwona chiyani apa? Njira zomwe zimanyamula mwachipambano choyambirira cha Fast zimakhala zocheperapo pafupifupi m'mapita onse kuposa njira zomwe zili ndi Slow prefix. Izi ndi zoona pa kugawa komanso kuthamanga kwa ntchito. Kumbali ina, kukhazikitsidwa kokongola komanso kokongola kwa mapu pogwiritsa ntchito njira za LINQ zomwe zimapangidwira izi ngati kuli kotheka, m'malo mwake, kumachepetsa kwambiri zokolola. Kusiyana ndi dongosolo. Zomwe zimachitika sizisintha ndi manambala osiyanasiyana odutsa. Kusiyana kokha ndi sikelo. Ndi LINQ ndi 4 - 200 nthawi pang'onopang'ono, pali zinyalala zambiri pamlingo womwewo.

kusinthidwa

Sindinakhulupirire maso anga, koma koposa zonse, mnzangayo sanakhulupirire maso anga kapena code yanga - Dmitry Tikhonov 0x1000000. Nditayang'ana kawiri yankho langa, adapeza mwanzeru ndikuwonetsa cholakwika chomwe ndidachiphonya chifukwa chakusintha kangapo pakukhazikitsa, koyamba mpaka komaliza. Pambuyo pokonza cholakwika chomwe chapezeka pakukhazikitsa kwa Moq, zotsatira zonse zidalowa m'malo. Malinga ndi zotsatira zobwereza, zomwe zimachitika kwambiri sizisintha - LINQ imakhudzabe magwiridwe antchito kuposa kulingalira. Komabe, ndizabwino kuti ntchito yophatikiza Mawu simachitidwa pachabe, ndipo zotsatira zake zimawonekera pogawika ndi nthawi yochitira. Kuyambitsa koyamba, pamene malo osasunthika ayambitsidwa, mwachibadwa amachedwa pang'onopang'ono pa njira "yofulumira", koma zinthu zimasintha.

Nazi zotsatira za kuyesanso:

Nkhani yosapambana yokhudza kufulumizitsa kulingalira

Kutsiliza: mukamagwiritsa ntchito kuwunikira mubizinesi, palibe chifukwa chochitira zanzeru - LINQ idya zokolola zambiri. Komabe, m'njira zolemetsa kwambiri zomwe zimafunikira kukhathamiritsa, mutha kusunga mawonekedwe ngati oyambitsa ndi nthumwi zophatikiza, zomwe zidzapereka malingaliro "mwachangu". Mwanjira iyi mutha kukhalabe ndi kusinthasintha kwa kusinkhasinkha komanso kuthamanga kwa ntchito.

Benchmark code ikupezeka pano. Aliyense akhoza kuyang'ana kawiri mawu anga:
Mayeso a HabraReflection

PS: khodi mumayeso imagwiritsa ntchito IoC, ndipo m'ma benchmarks imagwiritsa ntchito kupanga momveka bwino. Chowonadi ndi chakuti pakukhazikitsa komaliza ndidadula zinthu zonse zomwe zingakhudze magwiridwe antchito ndikupangitsa kuti zotsatira zake zikhale zaphokoso.

PPS: Zikomo kwa wogwiritsa ntchito Dmitry Tikhonov @0x1000000 pozindikira cholakwika changa pakukhazikitsa Moq, zomwe zidakhudza miyeso yoyamba. Ngati aliyense wa owerenga ali ndi karma yokwanira, chonde kondani. Bamboyo anaima, munthuyo anawerenga, munthuyo anayang’ana kawiri n’kuloza cholakwikacho. Ndikuganiza kuti izi ndi zoyenera kulemekezedwa komanso kuchitiridwa chifundo.

PPPS: zikomo kwa wowerenga mwanzeru yemwe adafika pansi pamawonekedwe ndi kapangidwe kake. Ndine wofanana komanso wosavuta. Kuyankhulana kwa zokambiranazo sikungofunika, koma ndinaganizira zotsutsazo. Ndikupempha projectile.

Source: www.habr.com

Kuwonjezera ndemanga