Sengoloa se sa atleheng mabapi le ho potlakisa ho thuisa

Hang-hang ke tla hlalosa sehlooho sa sehlooho. Morero oa pele e ne e le ho fana ka keletso e ntle, e ka tšeptjoang ea ho potlakisa tšebeliso ea ho thuisa ho sebelisa mohlala o bonolo empa e le oa sebele, empa nakong ea benchmarking ho ile ha fumaneha hore ho nahanisisa ha ho liehe joalokaha ke ne ke nahana, LINQ e lieha ho feta litorong tsa ka tse tšosang. Empa qetellong ho ile ha fumaneha hore le 'na ke entse phoso litekanyong ... Lintlha tsa pale ena ea bophelo li tlas'a sehiloeng le litlhaloso. Kaha mohlala ona o tloaelehile ebile o sebelisoa ka molao-motheo joalokaha o atisa ho etsoa khoebong, e ile ea e-ba ntho e thahasellisang haholo, joalokaha ho bonahala ho 'na, pontšo ea bophelo: phello ea lebelo la sehlooho se seholo sa sengoloa. ha e bonahale ka lebaka la mohopolo oa kantle: Moq, Autofac, EF Core le tse ling "marapo".

Ke ile ka qala ho sebetsa tlas'a maikutlo a sehlooho sena: Hobaneng ha Boikutlo bo lieha

Joalo ka ha u bona, mongoli o fana ka maikutlo a ho sebelisa baemeli ba kopaneng ho fapana le ho bitsa ka kotloloho mekhoa ea mofuta oa ho bonahatsa e le mokhoa o motle oa ho potlakisa ts'ebeliso. Ha e le hantle, ho na le tlhahiso ea IL, empa ke rata ho e qoba, kaha ena ke eona tsela e boima ka ho fetisisa ea ho etsa mosebetsi, e tletseng liphoso.

Ha ke nahana hore esale ke e-na le maikutlo a tšoanang mabapi le lebelo la ho thuisa, ke ne ke sa ikemisetsa ka ho khetheha ho botsa liqeto tsa mongoli.

Hangata ke kopana le tšebeliso e se nang kelello ea ho nahana ka har'a khoebo. Mofuta o nkuoe. Boitsebiso bo mabapi le thepa bo nkoa. Mokhoa oa SetValue o bitsoa 'me bohle baa thaba. Boleng bo fihlile sebakeng seo ho shebiloeng ho sona, bohle ba thabile. Batho ba bohlale haholo - batho ba baholo le baetapele ba sehlopha - ngola likeketso tsa bona ho hanyetsa, ba ipapisitse le ts'ebetso e joalo e se nang kelello ea limmapa tsa "universal" tsa mofuta o mong ho ea ho o mong. Ntho ea bohlokoa hangata ke ena: re nka masimo 'ohle, re nka thepa eohle, re pheta-pheta holim'a eona: haeba mabitso a litho tsa mofuta a tšoana, re phethahatsa SetValue. Nako le nako re tšoara mekhelo ka lebaka la liphoso moo re sa kang ra fumana thepa e 'ngoe ea mefuta, empa le mona ho na le mokhoa oa ho tsoa o ntlafatsang ts'ebetso. Leka/tshwara.

Ke bone batho ba qapa bocha li-parser le limmapa ntle le ho hlomela ka botlalo mabapi le hore na mechini e tlileng pele ho bona e sebetsa joang. Ke bone batho ba pata ts'ebetso ea bona e se nang kelello ka mor'a maano, ka morao ho li-interfaces, ka morao ho liente, joalokaha eka sena se ka lokafatsa bacchanalia e latelang. Ke ile ka phahamisa nko ea ka ha ke lemoha lintho tse joalo. Ha e le hantle, ha kea ka ka lekanya phallo ea sebele ea ts'ebetso, 'me, haeba ho khoneha, ke ile ka fetola ts'ebetsong hore e be "e nepahetseng" haholoanyane haeba nka khona ho e fumana. Ka hona, litekanyo tsa pele tse boletsoeng ka tlase li ile tsa mpherekanya haholo.

Ke nahana hore bongata ba lona, ​​ho bala Richter kapa litsebi tse ling tsa maikutlo, le fumane polelo e nepahetseng ka ho feletseng ea hore ho nahanisisa ka khoutu ke ntho e nang le phello e mpe haholo ts'ebetsong ea kopo.

Ho nahana ka mohala ho qobella CLR ho feta likopanong ho fumana eo e e hlokang, ho hula metadata ea bona, ho e hlalosa, joalo-joalo. Ho phaella moo, ho nahanisisa ha u ntse u tsamaea ka tatellano ho lebisa ho kabong ea mohopolo o moholo. Re sebelisa mohopolo, CLR e sibolla GC mme li-frieze lia qala. E lokela ho ba butle haholo, nkholoe. Palo e kholo ea memori ho li-server tsa sejoale-joale tsa tlhahiso kapa mechini ea leru ha e thibele ho lieha ho sebetsa haholo. Ebile, ha mohopolo o ntse o eketseha, ho na le monyetla o moholo oa ho HLOKOMELA hore na GC e sebetsa joang. Boikutlo, ka khopolo, ke lesela le lefubelu le eketsehileng bakeng sa hae.

Leha ho le joalo, kaofela ha rona re sebelisa lijana tsa IoC le limmapa tsa matsatsi, molao-motheo oa ts'ebetso o ipapisitse le ho nahanisisa, empa hangata ha ho na lipotso mabapi le ts'ebetso ea bona. Che, eseng hobane ho hlahisoa ha litšepeho le ho itokolla ho tsoa ho mehlala e lekanyelitsoeng ea maemo a kantle ho hlokahala hoo re tlamehang ho tela ts'ebetso maemong afe kapa afe. Ntho e ngoe le e ngoe e bonolo - ha e ame ts'ebetso haholo.

'Nete ke hore mekhoa e tloaelehileng ka ho fetisisa e thehiloeng ho theknoloji ea ho bonahatsa e sebelisa mefuta eohle ea maqheka ho sebetsa le eona ka mokhoa o nepahetseng haholoanyane. Hangata sena ke cache. Ka tloaelo tsena ke Expressions le baemeli ba hlophisitsoeng ho tsoa ho sefate sa polelo. E tšoanang automapper e boloka bukantswe e hlodisanang e tsamaellanang le mefuta e nang le ditshebetso tse ka fetolelang e nngwe ho ya ho e nngwe ntle le ho bitsa reflection.

See se finyelloa joang? Ha e le hantle, sena ha se fapane le logic eo sethala ka boeona se se sebelisang ho hlahisa khoutu ea JIT. Ha mokhoa o bitsoa ka lekhetlo la pele, oa bokelloa ('me, e, ts'ebetso ena ha e potlake); mehala e latelang, taolo e fetisetsoa mokhoeng o seng o ntse o hlophisitsoe,' me ho ke ke ha ba le likhaello tse kholo tsa ts'ebetso.

Tabeng ea rona, o ka sebelisa pokello ea JIT ebe o sebelisa boits'oaro bo hlophisitsoeng ka ts'ebetso e ts'oanang le balekane ba eona ba AOT. Mantsoe a tla re thusa tabeng ena.

Molao-motheo oo ho buuoang ka oona o ka hlalosoa ka bokhutšoanyane ka tsela e latelang:
U lokela ho boloka sephetho sa ho qetela sa ho nahanisisa joalo ka moemeli ea nang le mosebetsi o hlophisitsoeng. Hape hoa utloahala ho boloka lintho tsohle tse hlokahalang ka tlhaiso-leseling ea mofuta oa mofuta oa hau, mosebeletsi, tse bolokiloeng kantle ho lintho.

Ho na le mabaka a utloahalang tabeng ena. Ho sebelisa kelello ho re bolella hore haeba ntho e itseng e ka bokelloa 'me ea bolokoa, joale e lokela ho etsoa.

Ha re sheba pele, ho lokela ho boleloa hore cache ha e sebetsa ka ho nahanisisa e na le melemo ea eona, le haeba u sa sebelise mokhoa o reriloeng oa ho bokella lipolelo. Ha e le hantle, mona ke ntse ke pheta-pheta lipolelo tsa mongoli oa sehlooho seo ke buang ka sona ka holimo.

Joale mabapi le khoutu. Ha re shebeng mohlala o ipapisitseng le bohloko ba ka ba morao-rao boo ke ileng ka tlameha ho tobana le bona tlhahisong e tebileng ea setsi sa mekoloto se tebileng. Likarolo tsohle li iqapetsoe hoo ho seng motho ea ka hakanyang.

Ho na le moelelo o itseng. Ho be le Kopana. Ho na le mangolo a nang le 'mele o emeng, moo parser le hydrator li theha mabitso ana a tšoanang. Lengolo le ile la fihla, ra le bala, ra le arola ka lipara tsa bohlokoa, ra theha lebitso, 'me ra le boloka polokelong ea litaba.

Ke tsa mathomo. Ha re re lebitso le na le thepa Lebitso le Feletseng, Lilemo le Mohala oa Mohala. Lintlha tsena li fetisoa lengolong. Khoebo e boetse e batla ts'ehetso ea ho khona ho kenya linotlolo tse ncha ka potlako bakeng sa ho etsa 'mapa oa thepa ea mokhatlo ka lipara 'meleng oa lengolo. Haeba motho e mong a entse thaepo ho thempleite kapa haeba pele ho tokollo ho hlokahala ho qala 'mapa ka potlako ho tsoa ho molekane e mocha, ho ikamahanya le sebopeho se secha. Ebe re ka eketsa khokahano e ncha ea 'mapa joalo ka datafix e theko e tlase. Ke hore, mohlala oa bophelo.

Re kenya ts'ebetsong, re theha liteko. E sebetsa.

Nke ke ka fana ka khoutu: ho na le mehloli e mengata, 'me e fumaneha ho GitHub ka sehokelo qetellong ea sengoloa. U ka li jarisa, ua li hlokofatsa ho feta tekano le ho li lekanya, joalo ka ha li tla ama boemo ba hau. Ke tla fana feela ka khoutu ea mekhoa e 'meli ea template e khethollang hydrator, e neng e lokela ho potlaka, ho tloha ho hydrator, e neng e lokela ho lieha.

Monahano o tjena: mokhoa oa template o amohela lipara tse hlahisoang ke motheo oa parser logic. The LINQ layer ke parser le logic ea motheo ea hydrator, e etsang kopo ho moelelo oa database le ho bapisa linotlolo le lipara ho tloha ho parser (bakeng sa mesebetsi ena ho na le khoutu ntle le LINQ bakeng sa papiso). Ka mor'a moo, lipara li fetisetsoa ho mokhoa oa mantlha oa hydration mme boleng ba lipara bo beoa ho thepa e tsamaellanang ea setheo.

"Potlako" (Sehlongoa Pele Ka potlako maemong a benchmark):

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

Joalo ka ha re bona, ho sebelisoa pokello e tsitsitseng e nang le thepa ea setter - li-lambda tse hlophisitsoeng tse bitsang setter entity. E entsoe ka khoutu e latelang:

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

Ka kakaretso ho hlakile. Re haola le meaho, re theha baemeli bakeng sa ba letsetsa li-setter, 'me re ba boloke. Ebe rea letsa ha ho hlokahala.

“E butle” (Sehlongoapele se liehang ka litekanyetso):

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

Mona re feta meaho hang-hang ebe re letsetsa SetValue ka kotloloho.

Bakeng sa ho hlaka le joalo ka tšupiso, ke sebelisitse mokhoa o sa tsebeng letho o ngolang boleng ba lipara tsa bona tsa khokahano ka kotloloho libakeng tsa mokhatlo. Prefix – Bukana.

Joale ha re nke BenchmarkDotNet 'me re hlahlobe ts'ebetso. 'Me ka tšohanyetso ... (spoiler - sena ha se sephetho se nepahetseng, lintlha li ka tlase)

Sengoloa se sa atleheng mabapi le ho potlakisa ho thuisa

Re bona eng moo? Mekhoa e nang le tlhōlo sehlohlolong sa Fast e fetoha butle hoo e batlang e le lipallong tsohle ho feta mekhoa e nang le sehlomathiso sa Slow. Sena ke 'nete bakeng sa kabo le lebelo la mosebetsi. Ka lehlakoreng le leng, ts'ebetsong e ntle le e ntle ea 'mapa e sebelisang mekhoa ea LINQ e reretsoeng sena hohle moo ho khonehang, ho fapana le hoo, e fokotsa tlhahiso haholo. Phapang ke ea tsamaiso. Mokhoa ha o fetohe ka lipalo tse fapaneng tsa ho feta. Phapang e le 'ngoe feela ke tekanyo. Ka LINQ e tsamaea butle ka makhetlo a 4 - 200, ho na le litšila tse ngata hoo e ka bang sekala se lekanang.

ntjhafatswa

Ke ne ke sa kholoe mahlo a ka, empa habohlokoa le ho feta, mosebetsi-'moho le rona o ne a sa lumele mahlo a ka kapa khoutu ea ka - Dmitry Tikhonov 0x1000000. Ha a se a hlahlobile tharollo ea ka habeli, o ile a sibolla ka bokhabane mme a supa phoso eo ke ileng ka e fosa ka lebaka la liphetoho tse ngata ts'ebetsong, ho qala ho fihlela qetellong. Kamora ho lokisa phoso e fumanoeng ho setupong sa Moq, liphetho tsohle li ile tsa oela sebakeng. Ho latela liphetho tsa tlhahlobo, mokhoa o ka sehloohong ha o fetohe - LINQ e ntse e ama ts'ebetso ho feta ho nahanisisa. Leha ho le joalo, ho monate hore mosebetsi o nang le Expression compilation ha o etsoe lefeela, 'me sephetho se bonahala ka nako ea kabo le ea ho phethahatsa. Ho qalisoa ha pele, ha masimo a tsitsitseng a qalisoa, ka tlhaho a lieha ka mokhoa oa "ka potlako", empa joale boemo bo fetoha.

Liphetho tsa tlhahlobo hape ke tsena:

Sengoloa se sa atleheng mabapi le ho potlakisa ho thuisa

Qetello: ha o sebelisa ho thuisa khoebong, ha ho na tlhoko e khethehileng ea ho sebelisa maqheka - LINQ e tla ja tlhahiso le ho feta. Leha ho le joalo, ka mekhoa e boima haholo e hlokang ho ntlafatsoa, ​​​​u ka boloka ho nahanisisa ka mokhoa oa li-initiator le li-compilers tsa baemeli, tse tla fana ka "potlako" logic. Ka tsela ena o ka boloka ka bobeli ho feto-fetoha ha maikutlo le lebelo la ts'ebeliso.

Khoutu ea benchmark ea fumaneha mona. Mang kapa mang a ka hlahloba mantsoe a ka habeli:
Liteko tsa HabraReflection

PS: khoutu litekong e sebelisa IoC, 'me ho li-benchmark e sebelisa moaho o hlakileng. 'Nete ke hore ts'ebetsong ea ho qetela ke ile ka khaola lintlha tsohle tse ka amang ts'ebetso' me tsa etsa hore sephetho se be lerata.

PPS: Ke leboha mosebelisi Dmitry Tikhonov @0x1000000 bakeng sa ho fumana phoso ea ka ea ho theha Moq, e ileng ea ama litekanyo tsa pele. Haeba e mong oa babali a na le karma e lekaneng, ka kopo e rate. Monna a ema, monna a bala, monna a hlahloba habeli mme a supa phoso. Ke nahana hore sena se lokeloa ke tlhompho le kutloelo-bohloko.

PPPS: ke leboha 'mali ea hlokolosi ea fihlileng botebong ba setaele le moralo. Ke molemong oa ho ts'oana le ho ba bonolo. Lipuisano tsa nehelano li siea ho hongata ho lakatsehang, empa ke ile ka ela hloko ho nyatsuoa. Ke kopa projectile.

Source: www.habr.com

Eketsa ka tlhaloso