Atik san siksè sou akselere refleksyon

Mwen pral imedyatman eksplike tit la nan atik la. Plan orijinal la te bay bon konsèy serye sou kòman yo akselere itilizasyon refleksyon lè l sèvi avèk yon egzanp senp men reyalis, men pandan benchmarking li te vin wè ke refleksyon pa dousman jan mwen te panse, LINQ pi dousman pase nan kochma mwen yo. Men, nan fen li te tounen soti ke mwen tou te fè yon erè nan mezi yo ... Detay nan istwa sa a lavi yo anba koupe a ak nan kòmantè yo. Depi egzanp lan se byen komen ak aplike nan prensip jan yo anjeneral fè nan yon antrepriz, li te tounen soti nan yon demonstrasyon enteresan, jan li sanble m ', nan lavi: enpak la sou vitès la nan sijè prensipal la nan atik la te. pa aparan akòz lojik ekstèn: Moq, Autofac, EF Nwayo ak lòt moun "espageti".

Mwen te kòmanse travay anba enpresyon atik sa a: Poukisa Refleksyon ralanti

Kòm ou ka wè, otè a sijere lè l sèvi avèk delege konpile olye pou yo rele dirèkteman metòd tip refleksyon kòm yon bon fason pou pi vit aplikasyon an. Gen, nan kou, emisyon IL, men mwen ta renmen evite li, depi sa a se fason ki pi travay-entansif fè travay la, ki se plen ak erè.

Lè nou konsidere ke mwen te toujou gen yon opinyon menm jan an sou vitès la nan refleksyon, mwen pa t 'an patikilye gen entansyon kesyone konklizyon otè a.

Mwen souvan rankontre itilizasyon nayif nan refleksyon nan antrepriz la. Se kalite a pran. Yo pran enfòmasyon sou pwopriyete a. Yo rele metòd SetValue epi tout moun kontan. Valè a te rive nan jaden sib la, tout moun kontan. Trè entelijan moun - granmoun aje ak ekip dirije - ekri ekstansyon yo nan objè, ki baze sou yon aplikasyon nayif "inivèsèl" mappers nan yon kalite nan yon lòt. Sans la se nòmalman sa a: nou pran tout jaden yo, pran tout pwopriyete yo, repete sou yo: si non yo nan manm yo kalite matche ak, nou egzekite SetValue. De tan zan tan nou trape eksepsyon akòz erè kote nou pa t 'jwenn kèk pwopriyete nan youn nan kalite yo, men menm isit la gen yon fason soti ki amelyore pèfòmans. Eseye/trape.

Mwen te wè moun re-envante parseur ak mape san yo pa konplètman ame ak enfòmasyon sou fason machin yo ki te vin anvan yo travay. Mwen te wè moun kache aplikasyon nayif yo dèyè estrateji, dèyè interfaces, dèyè piki, kòm si sa a ta eskize bacchanalia ki vin apre yo. Mwen vire nen mwen nan reyalizasyon sa yo. An reyalite, mwen pa t 'mezire fwit pèfòmans reyèl la, epi, si sa posib, mwen tou senpleman chanje aplikasyon an nan yon pi "optimal" yon sèl si mwen te kapab mete men sou li. Se poutèt sa, premye mezi yo diskite anba a seryezman konfonn mwen.

Mwen panse ke anpil nan nou, li Richter oswa lòt ideyolojis, te vin jwenn yon deklarasyon konplètman jis ke refleksyon nan kòd se yon fenomèn ki gen yon enpak trè negatif sou pèfòmans aplikasyon an.

Rele refleksyon fòse CLR a ale nan asanble yo jwenn youn nan yo bezwen, rale metadata yo, analize yo, elatriye. Anplis de sa, refleksyon pandan y ap travèse sekans mennen nan alokasyon an nan yon gwo kantite memwa. Nou ap itilize memwa, CLR dekouvwi GC a ak friz kòmanse. Li ta dwe notables dousman, kwè m. Gwo kantite memwa sou sèvè pwodiksyon modèn oswa machin nwaj yo pa anpeche gwo reta nan pwosesis. An reyalite, plis memwa, plis ou gen plis chans pou w REMARKE kijan GC fonksyone. Refleksyon se, nan teyori, yon ranyon wouj siplemantè pou li.

Sepandan, nou tout sèvi ak resipyan IoC ak mape dat, prensip fonksyònman ki baze sou refleksyon tou, men anjeneral pa gen okenn kesyon sou pèfòmans yo. Non, pa paske entwodiksyon depandans ak abstraksyon soti nan modèl ekstèn kontèks limite yo tèlman nesesè ke nou dwe sakrifye pèfòmans nan nenpòt ka. Tout bagay se pi senp - li reyèlman pa afekte pèfòmans anpil.

Reyalite a se ke kad ki pi komen ki baze sou teknoloji refleksyon itilize tout kalite ke trik nouvèl yo travay ak li pi optimal. Anjeneral sa a se yon kachèt. Tipikman sa yo se ekspresyon ak delege konpile nan pye bwa a ekspresyon. Menm automapper a kenbe yon diksyonè konpetitif ki matche kalite ak fonksyon ki ka konvèti youn nan lòt san yo pa rele refleksyon.

Ki jan sa reyalize? Esansyèlman, sa a pa diferan de lojik ke platfòm la li menm itilize pou jenere kòd JIT. Lè yo rele yon metòd la pou premye fwa, li konpile (e, wi, pwosesis sa a pa rapid); nan apèl ki vin apre yo, kontwòl yo transfere nan metòd la deja konpile, epi pa pral gen okenn avantaj pèfòmans enpòtan.

Nan ka nou an, ou ka tou sèvi ak konpilasyon JIT ak Lè sa a, sèvi ak konpòtman an konpile ak pèfòmans nan menm jan ak tokay AOT li yo. Ekspresyon ap vin ede nou nan ka sa a.

Prensip la nan kesyon an ka yon ti tan fòmile jan sa a:
Ou ta dwe kache rezilta final refleksyon an kòm yon delege ki gen fonksyon konpile a. Li fè sans tou pou kachèt tout objè ki nesesè yo ak enfòmasyon kalite nan domèn kalite ou a, travayè a, ki estoke deyò objè yo.

Gen lojik nan sa a. Bon sans di nou ke si yon bagay ka konpile ak kachèt, Lè sa a, li ta dwe fè.

Gade pi devan, li ta dwe di ke kachèt la nan travay ak refleksyon gen avantaj li yo, menm si ou pa sèvi ak metòd la pwopoze nan konpile ekspresyon. Aktyèlman, isit la mwen tou senpleman repete tèz yo nan otè a nan atik la ke mwen refere pi wo a.

Kounye a sou kòd la. Ann gade nan yon egzanp ki baze sou dènye doulè mwen ke mwen te fè fas a nan yon pwodiksyon serye nan yon enstitisyon kredi serye. Tout antite yo fiktiv pou pèsonn pa ta devine.

Gen kèk sans. Se pou gen kontak. Gen lèt ki gen yon kò estanda, ki soti nan ki analizeur a ak idratan kreye kontak sa yo menm. Yon lèt te rive, nou li li, analize li an pè kle-valè, kreye yon kontak, epi sove li nan baz done a.

Se elemantè. Ann di yon kontak gen pwopriyete non konplè, laj ak telefòn kontak. Done sa yo transmèt nan lèt la. Biznis la vle tou sipò pou kapab byen vit ajoute nouvo kle pou kat pwopriyete antite nan pè nan kò a nan lèt la. Nan ka yon moun te fè yon typo nan modèl la oswa si anvan lage a li nesesè ijan lanse kat soti nan yon nouvo patnè, adapte yo ak nouvo fòma a. Lè sa a, nou ka ajoute yon nouvo korelasyon kat kòm yon datafix bon mache. Sa vle di, yon egzanp lavi.

Nou aplike, kreye tès. Travay.

Mwen pa pral bay kòd la: gen yon anpil nan sous, epi yo disponib sou GitHub atravè lyen ki nan fen atik la. Ou ka chaje yo, tòtire yo pi lwen pase rekonesans ak mezire yo, jan li ta afekte nan ka w la. Mwen pral sèlman bay kòd la nan de metòd modèl ki fè distenksyon ant hydrator la, ki te sipoze rapid, ak hydrator la, ki te sipoze dousman.

Lojik la se jan sa a: metòd modèl la resevwa pè ki te pwodwi pa lojik analizeur debaz la. Kouch LINQ la se parser la ak lojik debaz hydrator la, ki fè yon demann nan kontèks baz done a epi konpare kle ak pè soti nan analiz la (pou fonksyon sa yo gen kòd san LINQ pou konparezon). Apre sa, pè yo pase nan metòd idratasyon prensipal la ak valè pè yo mete nan pwopriyete ki koresponn yo nan antite a.

"Fast" (Prefiks vit nan referans):

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

Kòm nou ka wè, yo itilize yon koleksyon estatik ak pwopriyete setter - konpile lambda ki rele antite setter la. Kreye pa kòd sa a:

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

An jeneral li klè. Nou travèse pwopriyete yo, kreye delege pou yo ki rele setters, epi sove yo. Lè sa a, nou rele lè sa nesesè.

"Slow" (Prefiks Slow nan referans):

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

Isit la nou imedyatman kontoune pwopriyete yo epi rele SetValue dirèkteman.

Pou klè ak kòm yon referans, mwen aplike yon metòd nayif ki ekri valè yo nan pè korelasyon yo dirèkteman nan jaden yo antite. Prefiks - Manyèl.

Koulye a, ann pran BenchmarkDotNet epi egzamine pèfòmans lan. Epi toudenkou... (spoiler - sa a se pa rezilta ki kòrèk la, detay yo anba a)

Atik san siksè sou akselere refleksyon

Kisa nou wè la a? Metòd ki pote triyonfan prefiks rapid la vin pi dousman nan prèske tout pas pase metòd ak prefiks Slow la. Sa a se vre pou tou de alokasyon ak vitès nan travay. Nan lòt men an, yon aplikasyon bèl ak elegant nan kat lè l sèvi avèk metòd LINQ gen entansyon pou sa a tout kote sa posib, okontrè, anpil diminye pwodiktivite. Diferans lan se nan lòd. Tandans la pa chanje ak diferan kantite pas. Sèl diferans lan se nan echèl la. Avèk LINQ li se 4 - 200 fwa pi dousman, gen plis fatra sou apeprè menm echèl la.

MIZAJOU

Mwen pa t 'kwè je mwen, men sa ki pi enpòtan, kòlèg nou an pa t 'kwè ni je mwen oswa kòd mwen an - Dmitry Tikhonov 0x1000000. Èske w gen doub tcheke solisyon mwen an, li briyan dekouvri ak vize deyò yon erè ke mwen rate akòz yon kantite chanjman nan aplikasyon an, inisyal ak final la. Apre ranje ensèk yo te jwenn nan konfigirasyon Moq la, tout rezilta yo te tonbe an plas. Dapre rezilta retest yo, tandans prensipal la pa chanje - LINQ toujou afekte pèfòmans plis pase refleksyon. Sepandan, li bon ke travay la ak konpilasyon Ekspresyon pa fè pou gremesi, ak rezilta a se vizib tou de nan alokasyon ak tan ekzekisyon. Premye lansman an, lè jaden estatik yo inisyalize, se natirèlman pi dousman pou metòd "vit" la, men Lè sa a, sitiyasyon an chanje.

Men rezilta retest la:

Atik san siksè sou akselere refleksyon

Konklizyon: lè w ap itilize refleksyon nan yon antrepriz, pa gen okenn bezwen patikilye pou w ale nan ke trik nouvèl - LINQ ap manje pwodiktivite plis. Sepandan, nan metòd gwo chaj ki mande pou optimize, ou ka sove refleksyon nan fòm inisyalize ak konpilateur delege, ki pral Lè sa a, bay lojik "vit". Nan fason sa a ou ka kenbe tou de fleksibilite nan refleksyon ak vitès la nan aplikasyon an.

Kòd referans a disponib isit la. Nenpòt moun ka double tcheke pawòl mwen yo:
HabraReflectionTests

PS: kòd la nan tès yo sèvi ak IoC, ak nan referans yo li itilize yon konstriksyon eksplisit. Reyalite a se ke nan aplikasyon final la mwen koupe tout faktè ki ta ka afekte pèfòmans ak fè rezilta a fè bwi.

PPS: Mèsi a itilizatè a Dmitry Tikhonov @0x1000000 pou dekouvri erè mwen nan mete Moq, ki afekte premye mezi yo. Si nenpòt nan lektè yo gen ase karma, tanpri renmen li. Nonm lan sispann, nonm lan li, nonm lan double tcheke epi lonje dwèt sou erè a. Mwen panse ke sa merite respè ak senpati.

PPPS: gras a lektè a metikuleu ki te rive nan pati anba a nan style la ak konsepsyon. Mwen se pou inifòmite ak konvenyans. Diplomasi prezantasyon an kite anpil bagay yo vle, men mwen te pran kritik la an kont. Mwen mande pou pwojektil la.

Sous: www.habr.com

Add nouvo kòmantè