I-athikili engaphumelelanga emayelana nokusheshisa ukuzindla

Ngizosichaza ngokushesha isihloko sesihloko. Uhlelo lwangempela kwakuwukunikeza iseluleko esihle, esinokwethenjelwa sendlela yokusheshisa ukusetshenziswa kokucabangisisa usebenzisa isibonelo esilula kodwa esingokoqobo, kodwa ngesikhathi sokulinganisa kwavela ukuthi ukucabangela akunensi njengoba bengicabanga, i-LINQ ihamba kancane kunasephusheni lami elibi. Kodwa ekugcineni kwavela ukuthi nami ngenza iphutha ezilinganisweni ... Imininingwane yale ndaba yempilo ingaphansi kokusika futhi kuma-comments. Njengoba isibonelo sivamile futhi sisetshenziswa ngokomgomo njengoba kuvame ukwenziwa ebhizinisini, kuvele kwaba okuthakazelisayo, njengoba kubonakala kimi, ukubonakaliswa kwempilo: umthelela ngesivinini sesihloko esiyinhloko salesi sihloko. akubonakali ngenxa ye-logic yangaphandle: i-Moq, i-Autofac, i-EF Core namanye "amabhande".

Ngaqala ukusebenza ngaphansi kombono walesi sihloko: Kungani i-Reflection ihamba kancane

Njengoba ubona, umbhali uphakamisa ukusebenzisa izithunywa ezihlanganisiwe esikhundleni sokubiza ngokuqondile izindlela zohlobo lokubonisa njengendlela enhle yokusheshisa kakhulu uhlelo lokusebenza. Kukhona, vele, ukukhishwa kwe-IL, kodwa ngingathanda ukukugwema, ngoba lena kuyindlela enzima kakhulu yokwenza umsebenzi, egcwele amaphutha.

Uma kucatshangelwa ukuthi bengilokhu nginombono ofanayo mayelana nesivinini sokuzindla, angizange ngihlose ukungabaza iziphetho zombhali.

Ngivame ukuhlangana nokusetshenziswa okungenangqondo kokucabanga ebhizinisini. Uhlobo luthathwa. Ulwazi mayelana nempahla luyathathwa. Indlela ye-SetValue ibizwa futhi wonke umuntu uyajabula. Inani selifikile endaweni okuhlosiwe, wonke umuntu ujabule. Abantu abahlakaniphe kakhulu - abadala nabaholayo beqembu - babhala izandiso zabo ukuze baphikise, ngokusekelwe ekusetshenzisweni okungahlakaniphile okunjalo "komhlaba wonke" wamamephu wohlobo olulodwa kuya kolunye. Ingqikithi ivamise ukuba yilokhu: sithatha zonke izinkambu, sithathe zonke izakhiwo, siphindaphinde phezu kwazo: uma amagama ohlobo lwamalungu ehambisana, senza i-SetValue. Ngezikhathi ezithile sibamba okuhlukile ngenxa yamaphutha lapho singazange sithole impahla ethile kwenye yezinhlobo, kodwa nalapha kukhona indlela yokuphuma ethuthukisa ukusebenza. Zama/bamba.

Ngike ngabona abantu besungula kabusha abahlaluli nabahleli bemephu ngaphandle kokuhlonyiswa ngokugcwele ngolwazi lokuthi imishini efike ngaphambi kwabo isebenza kanjani. Ngibone abantu befihla ukusebenzisa kwabo okungaqondakali ngemuva kwamasu, ngemuva kokuxhumana, ngemuva kwemijovo, njengokungathi lokhu kuzothethelela i-bacchanalia elandelayo. Ngaphakamisa ikhala lami ngokuqaphela okunjalo. Eqinisweni, angizange ngilinganise ukuvuza kokusebenza kwangempela, futhi, uma kungenzeka, ngivele ngashintsha ukuqaliswa kwaba “kokungcono kakhulu” uma ngingathola izandla zami kukho. Ngakho-ke, izilinganiso zokuqala okukhulunywe ngazo ngezansi zangidida kakhulu.

Ngicabanga ukuthi abaningi benu, abafunda u-Richter noma abanye ongqondongqondo, bahlangabezane nesitatimende esilungile ngokuphelele sokuthi ukucabanga ngekhodi kuyinto enomthelela omubi kakhulu ekusebenzeni kohlelo lokusebenza.

Ukucabangela ukushaya kuphoqa i-CLR ukuthi idlule emihlanganweni ukuze ithole leyo emdingayo, ikhiphe imethadatha yayo, iyihlaziye, njll. Ngaphezu kwalokho, ukucabanga ngenkathi unqamula ukulandelana kuholela ekwabiweni kwenani elikhulu lenkumbulo. Sisebenzisa inkumbulo, i-CLR yembula i-GC futhi amafrieze aqala. Kufanele ihambe kancane ngokuphawulekayo, ngikholwe. Inani elikhulu lememori kumaseva wokukhiqiza wesimanje noma imishini yamafu awavimbeli ukubambezeleka okuphezulu kokucubungula. Eqinisweni, lapho inkumbulo eyengeziwe, maningi amathuba okuba UKWAZI ukuthi i-GC isebenza kanjani. Ukuzindla, ngokombono, i-rag ebomvu eyengeziwe kuye.

Kodwa-ke, sonke sisebenzisa iziqukathi ze-IoC namamephu wedethi, umgomo wokusebenza nawo osuselwe ekucabangeni, kodwa ngokuvamile akukho mibuzo mayelana nokusebenza kwabo. Cha, hhayi ngenxa yokuthi ukwethulwa kokuncika nokukhishwa kumamodeli womongo okhawulelwe wangaphandle kudingekile kangangokuthi kufanele sidele ukusebenza kunoma yisiphi isimo. Konke kulula - akuthinti ukusebenza kakhulu.

Iqiniso liwukuthi izinhlaka ezivame kakhulu ezisekelwe kubuchwepheshe bokubonisa zisebenzisa zonke izinhlobo zamaqhinga ukuze zisebenze nazo ngokufanele kakhulu. Ngokuvamile lena inqolobane. Ngokuvamile lawa Amazwi nezihambeli ezihlanganiswe kusukela esihlahleni senkulumo. I-automapper efanayo igcina isichazamazwi esincintisanayo esifana nezinhlobo ezinemisebenzi engaguqula eyodwa iyenze enye ngaphandle kokubiza ukubonakaliswa.

Kufinyelelwa kanjani lokhu? Empeleni, lokhu akuhlukile kumqondo osetshenziswa inkundla ngokwayo ukukhiqiza ikhodi ye-JIT. Uma indlela ibizwa okokuqala, iyahlanganiswa (futhi, yebo, le nqubo ayisheshi); ezingcingweni ezilandelayo, ukulawula kudluliselwa endleleni esivele ihlanganisiwe, futhi ngeke kube khona ukwehla okubalulekile kokusebenza.

Esimweni sethu, ungasebenzisa futhi ukuhlanganiswa kwe-JIT bese usebenzisa ukuziphatha okuhlanganisiwe nokusebenza okufanayo nozakwabo be-AOT. Izinkulumo zizosisiza kulokhu.

Isimiso okukhulunywa ngaso singakhiwa kafushane kanje:
Kufanele ufake kunqolobane umphumela wokugcina wokubonisa njengesithunywa esiqukethe umsebenzi ohlanganisiwe. Kunengqondo futhi ukufihla zonke izinto ezidingekayo ngolwazi lohlobo emikhakheni yohlobo lwakho, isisebenzi, ezigcinwe ngaphandle kwezinto.

Kukhona logic kulokhu. Umqondo ophusile usitshela ukuthi uma okuthile kungahlanganiswa futhi kugcinwe kunqolobane, kufanele kwenziwe.

Uma ubheka phambili, kufanele kushiwo ukuthi i-cache ekusebenzeni ngokuzindla inezinzuzo zayo, ngisho noma ungasebenzisi indlela ehlongozwayo yokuhlanganisa izinkulumo. Empeleni, lapha ngimane ngiphinda imibono yombhali wendatshana engibhekise kuyo ngenhla.

Manje mayelana nekhodi. Ake sibheke isibonelo esisekelwe ebuhlungwini bami bakamuva obekumele ngibhekane nabo ngesikhathi ngikhiqiza isikhungo esibucayi sezikweletu. Zonke izinhlangano zingamanga ukuze kungabikho muntu ongaqagela.

Kukhona ingqikithi. Makube khona Othintana naye. Kunezinhlamvu ezinomzimba ojwayelekile, lapho umhlaseli kanye ne-hydrator bakha laba othintana nabo abafanayo. Yafika incwadi, sayifunda, sayihlukanisa yaba ngamapheya enani elingukhiye, sakha othintana naye, sayigcina ku-database.

Kuyisisekelo. Ake sithi othintana naye unezakhiwo Igama Eligcwele, Iminyaka kanye Nocingo Lokuthintana naye. Le datha idluliselwa ngohlamvu. Ibhizinisi futhi lifuna usekelo ukuze likwazi ukungeza ngokushesha okhiye abasha bokwenza imephu izakhiwo zebhizinisi zibe ngamapheya emzimbeni wencwadi. Esimeni lapho othile enze iphutha kusifanekiso noma uma ngaphambi kokukhishwa kudingekile ukuqalisa ngokushesha ukumepha kusuka kuzakwethu omusha, ukuzivumelanisa nefomethi entsha. Bese singangeza ukuhlotshaniswa kwemephu okusha njengedatha eshibhile. Okungukuthi, isibonelo sempilo.

Sisebenzisa, senza izivivinyo. Iyasebenza.

Ngeke nginikeze ikhodi: kunemithombo eminingi, futhi iyatholakala ku-GitHub ngesixhumanisi ekugcineni kwesihloko. Ungawalayisha, uwahlukumeze ngendlela engenakubonwa futhi uwalinganise, njengoba kungathinta esimweni sakho. Ngizonikeza kuphela ikhodi yezindlela ezimbili zesifanekiso ezihlukanisa i-hydrator, okwakufanele isheshe, kusukela ku-hydrator, okwakufanele ihambe kancane.

Umqondo umi kanje: indlela yesifanekiso ithola amapheya akhiqizwe ubuhlakani bomhlahleli obuyisisekelo. Isendlalelo se-LINQ siwumhlahleli kanye nengqondo eyisisekelo ye-hydrator, eyenza isicelo kumongo wesizindalwazi futhi iqhathanise okhiye namapheya asuka kumhlaziyi (kule misebenzi kukhona ikhodi ngaphandle kwe-LINQ yokuqhathanisa). Okulandelayo, amapheya adluliselwa endleleni eyinhloko ye-hydration futhi amanani amapheya asethwe ezindaweni ezihambisanayo zebhizinisi.

“Fast” (Isiqalo Ngokushesha kuma-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;
        }

Njengoba singabona, kusetshenziswe iqoqo elimile elinezakhiwo ze-setter - ama-lambda ahlanganisiwe abiza inhlangano ye-setter. Idalwe ngekhodi elandelayo:

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

Ngokujwayelekile kuyacaca. Sinqamula izakhiwo, sidale izithunywa zazo ezishayela amasethi, futhi sizigcine. Bese sifona uma kunesidingo.

“Slow” (Isiqalo Sinensa kuma-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;
        }

Lapha sidlula ngokushesha izakhiwo futhi sishayele i-SetValue ngokuqondile.

Ukuze kube sobala nanjengereferensi, ngisebenzise indlela engenangqondo ebhala amanani amapheya awo okuxhumana ngokuqondile ezinkambini zebhizinisi. Isiqalo - Manuwali.

Manje ake sithathe i-BenchmarkDotNet futhi sihlole ukusebenza. Futhi ngokuzumayo... (spoiler - lokhu akuwona umphumela olungile, imininingwane ingezansi)

I-athikili engaphumelelanga emayelana nokusheshisa ukuzindla

Sibonani lapha? Izindlela ezithwala ngokunqobayo isiqalo Esisheshayo ziphenduka kancane cishe kuwo wonke amaphasi kunezindlela ezinesiqalo esithi Slow. Lokhu kuyiqiniso kukho kokubili ukwabiwa kanye nesivinini somsebenzi. Ngakolunye uhlangothi, ukuqaliswa okuhle nokuhle nokuhle kwemephu kusetshenziswa izindlela ze-LINQ ezihloselwe lokhu lapho kungenzeka khona, ngokuphambene nalokho, kunciphisa kakhulu ukukhiqiza. Umehluko ukuhleleka. Umkhuba awushintshi ngezinombolo ezahlukene zokuphasa. Umehluko kuphela esikalini. Nge-LINQ ihamba kancane izikhathi ezi-4 - 200, kunodoti omningi cishe esikalini esifanayo.

Kubuyekeziwe

Angizange ngiwakholelwe amehlo ami, kodwa okubaluleke nakakhulu, uzakwethu akazange awakholelwe amehlo ami noma ikhodi yami - UDmitry Tikhonov 0x1000000. Ngemva kokubheka isisombululo sami kabili, wathola ngobuhlakani futhi wabonisa iphutha engaligejayo ngenxa yezinguquko eziningi ekusetshenzisweni, kokuqala kuya kokugcina. Ngemva kokulungisa iphutha elitholakele ekusetheni kwe-Moq, yonke imiphumela yangena endaweni. Ngokwemiphumela yokuhlolwa kabusha, ukuthambekela okuyinhloko akushintshi - I-LINQ isathinta ukusebenza ngaphezu kokucabanga. Kodwa-ke, kuhle ukuthi umsebenzi wokuhlanganisa i-Expression awenziwa ize, futhi umphumela ubonakala ngesikhathi sokwabiwa nangesikhathi sokwenza. Ukwethulwa kokuqala, lapho izinkambu ezimile ziqaliswa, kuhamba kancane ngokwemvelo endleleni "esheshayo", kodwa isimo siyashintsha.

Nawu umphumela wokuhlolwa kabusha:

I-athikili engaphumelelanga emayelana nokusheshisa ukuzindla

Isiphetho: lapho usebenzisa ukucabanga ebhizinisini, asikho isidingo esithile sokuphendukela kumaqhinga - I-LINQ izodla umkhiqizo owengeziwe. Kodwa-ke, ezindleleni ezinomthwalo omkhulu ezidinga ukuthuthukiswa, ungagcina ukubonakaliswa ngendlela yeziqalisi kanye nabahlanganisi abathunyiwe, okuzobe sekuhlinzeka ngokunengqondo “okusheshayo”. Ngale ndlela ungagcina kokubili ukuguquguquka kokubonisa kanye nesivinini sohlelo lokusebenza.

Ikhodi yokuma iyatholakala lapha. Noma ubani angahlola kabili amazwi ami:
I-HabraReflectionTest

I-PS: ikhodi ekuhlolweni isebenzisa i-IoC, futhi kumabhentshimakhi isebenzisa ukwakheka okusobala. Iqiniso liwukuthi ekusetshenzisweni kokugcina nginqamule zonke izici ezingase zithinte ukusebenza futhi ngenze umphumela ube nomsindo.

I-PPS: Siyabonga kumsebenzisi UDmitry Tikhonov @0x1000000 ngokuthola iphutha lami ekusetheni i-Moq, ethinte izilinganiso zokuqala. Uma omunye wabafundi ene-karma eyanele, sicela uyithande. Yama indoda, yafunda indoda, indoda yahlola kabili yalikhomba iphutha. Ngicabanga ukuthi lokhu kufanele ukuhlonishwa nozwelo.

I-PPPS: sibonga umfundi ocophelelayo ofinyelele ekugcineni kwesitayela nokuklama. Ngingowokufana kanye nokwenza lula. I-diplomacy yokwethulwa ishiya okuningi okufiselekayo, kodwa ngikucabangele ukugxekwa. Ngicela iprojectile.

Source: www.habr.com

Engeza amazwana