Kab lus tsis ua tiav txog kev xav nrawm nrawm

Kuv mam li piav qhia lub npe ntawm kab lus tam sim ntawd. Thawj txoj kev npaj yog muab cov lus qhia zoo, txhim khu kev qha ntawm yuav ua li cas txhawm rau txhawm rau siv qhov kev xav tau siv qhov piv txwv yooj yim tab sis muaj tseeb, tab sis thaum lub sij hawm ntsuas nws tau pom tias qhov kev xav tsis tau qeeb raws li kuv xav, LINQ qeeb dua hauv kuv npau suav phem. Tab sis thaum kawg nws tau tig tawm tias kuv kuj tau ua yuam kev hauv kev ntsuas ... Cov ntsiab lus ntawm zaj dab neeg ntawm lub neej no yog nyob rau hauv qhov txiav thiab hauv cov lus. Txij li thaum tus piv txwv yog heev commonplace thiab siv nyob rau hauv lub hauv paus ntsiab lus raws li feem ntau yog ua nyob rau hauv ib tug enterprise, nws muab tawm los ua ib tug heev nthuav, raws li nws zoo nkaus li rau kuv, ua qauv qhia ntawm lub neej: qhov cuam tshuam rau qhov ceev ntawm lub ntsiab lus ntawm tsab xov xwm yog. tsis pom zoo vim yog sab nraud logic: Moq, Autofac, EF Core thiab lwm yam "bandings".

Kuv pib ua hauj lwm nyob rau hauv lub tswv yim ntawm tsab xov xwm no: Yog vim li cas Reflection qeeb

Raws li koj tuaj yeem pom, tus kws sau ntawv qhia siv cov neeg sawv cev sib sau ua ke es tsis txhob hu ncaj qha rau kev xav txog hom txheej txheem raws li txoj hauv kev zoo los ua kom nrawm rau daim ntawv thov. Muaj, tau kawg, IL emission, tab sis kuv xav kom zam nws, vim qhov no yog txoj hauv kev siv zog tshaj plaws los ua txoj haujlwm, uas yog qhov tsis raug.

Xav tias kuv ib txwm muaj kev xav zoo sib xws txog qhov ceev ntawm kev xav, kuv tsis tau tshwj xeeb los nug tus sau cov lus xaus.

Kuv feem ntau ntsib naive siv kev xav hauv kev lag luam. Hom yog coj. Cov ntaub ntawv hais txog cov cuab yeej raug coj mus. Txoj kev SetValue hu ua thiab txhua tus zoo siab. Tus nqi tau tuaj txog ntawm lub hom phiaj, txhua tus zoo siab. Cov neeg ntse heev - cov neeg laus thiab pab pawg ua thawj coj - sau lawv qhov txuas ntxiv los tawm tsam, ua raws li kev siv tsis zoo "universal" mappers ntawm ib hom mus rau lwm qhov. Lub ntsiab lus feem ntau yog qhov no: peb coj tag nrho cov teb, nqa tag nrho cov khoom, rov ua dua lawv: yog tias cov npe ntawm cov tswv cuab sib phim, peb ua SetValue. Qee lub sij hawm peb ntes tau qhov kev zam vim qhov yuam kev uas peb tsis pom qee yam khoom hauv ib hom, tab sis txawm tias ntawm no muaj ib txoj hauv kev uas txhim kho kev ua haujlwm. Sim / ntes.

Kuv tau pom cov neeg rov tsim dua tshiab parsers thiab mappers yam tsis tau muaj riam phom nrog cov ntaub ntawv hais txog yuav ua li cas cov tshuab uas tuaj ua ntej lawv ua haujlwm. Kuv tau pom cov neeg zais lawv cov kev coj tsis ncaj tom qab cov tswv yim, tom qab kev sib cuam tshuam, tom qab txhaj tshuaj, zoo li qhov no yuav zam tau cov bacchanalia tom qab. Kuv tig kuv lub qhov ntswg rau ntawm qhov kev paub zoo li no. Qhov tseeb, kuv tsis tau ntsuas qhov kev ua tau zoo tiag tiag, thiab, yog tias ua tau, kuv tsuas yog hloov qhov kev siv mus rau qhov "zoo tshaj" yog tias kuv tuaj yeem tau txais kuv txhais tes ntawm nws. Yog li ntawd, thawj qhov kev ntsuas tau tham hauv qab no ua rau kuv tsis meej pem.

Kuv xav tias ntau tus ntawm koj, nyeem Richter lossis lwm tus kws tshaj lij, tau hla cov lus ncaj ncees tag nrho uas qhov kev xav hauv cov lej yog qhov tshwm sim uas muaj kev cuam tshuam tsis zoo rau kev ua haujlwm ntawm daim ntawv thov.

Kev hu xov tooj rau kev xav yuam kom CLR mus los ntawm cov rooj sib tham kom pom qhov lawv xav tau, rub lawv cov metadata, txheeb xyuas lawv, thiab lwm yam. Tsis tas li ntawd, kev xav txog thaum taug kev ua ntu zus ua rau kev faib ua ntau lub cim xeeb. Peb tab tom siv lub cim xeeb, CLR nthuav tawm GC thiab pib friezes. Nws yuav tsum tau pom qeeb qeeb, ntseeg kuv. Lub cim xeeb loj ntawm cov khoom siv niaj hnub no lossis cov tshuab huab tsis tiv thaiv kev ua haujlwm qeeb. Qhov tseeb, ntau lub cim xeeb, qhov ntau dua koj yuav ceeb toom seb GC ua haujlwm li cas. Reflection yog, nyob rau hauv txoj kev xav, ib qho ntxiv liab rag rau nws.

Txawm li cas los xij, peb txhua tus siv IoC ntim thiab hnub tim mappers, lub hauv paus ntsiab lus ntawm kev khiav hauj lwm yog raws li kev xav, tab sis feem ntau tsis muaj lus nug txog lawv cov kev ua tau zoo. Tsis yog, tsis yog vim hais tias kev qhia txog kev vam khom thiab kev paub daws teeb meem los ntawm cov qauv kev txwv sab nraud yog qhov tsim nyog uas peb yuav tsum tau txi kev ua tau zoo nyob rau hauv txhua rooj plaub. Txhua yam yog yooj yim - nws yeej tsis cuam tshuam kev ua haujlwm ntau.

Qhov tseeb yog tias cov txheej txheem ntau tshaj plaws uas ua raws li kev xav txog kev siv tshuab siv txhua yam kev ua kom yuam kev los ua haujlwm nrog nws zoo dua. Feem ntau qhov no yog lub cache. Feem ntau cov no yog Cov Lus Qhia thiab cov neeg sawv cev muab tso ua ke los ntawm tsob ntoo qhia. Tib lub automapper tuav cov phau ntawv txhais lus sib tw uas sib tw nrog cov haujlwm uas tuaj yeem hloov mus rau lwm qhov yam tsis tau hu rau kev xav.

Qhov no ua tiav li cas? Qhov tseem ceeb, qhov no tsis txawv ntawm cov logic uas lub platform nws tus kheej siv los tsim JIT code. Thaum ib txoj kev raug hu ua thawj zaug, nws tau muab tso ua ke (thiab, yog, cov txheej txheem no tsis nrawm); ntawm kev hu xov tooj tom ntej, kev tswj hwm raug xa mus rau cov txheej txheem uas twb tau sau tseg lawm, thiab yuav tsis muaj qhov cuam tshuam loj heev.

Hauv peb cov ntaub ntawv, koj tuaj yeem siv JIT muab tso ua ke thiab tom qab ntawd siv tus cwj pwm muab tso ua ke nrog kev ua haujlwm zoo ib yam li nws cov neeg sib tw AOT. Cov lus qhia yuav tuaj rau peb pab hauv qhov no.

Lub hauv paus ntsiab lus hauv nqe lus nug tuaj yeem ua luv luv raws li hauv qab no:
Koj yuav tsum cache qhov kawg tshwm sim ntawm kev xav raws li tus neeg sawv cev uas muaj cov haujlwm sib sau ua ke. Nws kuj ua rau kev nkag siab rau cache tag nrho cov khoom tsim nyog nrog cov ntaub ntawv hauv cov teb ntawm koj hom, tus neeg ua haujlwm, uas tau muab khaws cia sab nraum cov khoom.

Muaj logic nyob rau hauv no. Kev nkag siab zoo qhia peb tias yog tias ib yam dab tsi tuaj yeem muab tso ua ke thiab cached, ces nws yuav tsum ua.

Saib tom ntej, nws yuav tsum tau hais tias lub cache hauv kev ua haujlwm nrog kev xav tau nws qhov zoo, txawm tias koj tsis siv cov txheej txheem ntawm kev sau cov kab lus. Qhov tseeb, ntawm no kuv tsuas yog rov hais dua cov lus no ntawm tus sau ntawm tsab xov xwm uas kuv hais saum toj no.

Tam sim no hais txog qhov chaws. Cia peb saib ib qho piv txwv uas yog raws li kuv qhov mob tsis ntev los no uas kuv tau ntsib hauv kev tsim khoom loj ntawm lub tsev qiv nyiaj loj. Txhua qhov chaw yog qhov tseeb kom tsis muaj leej twg xav tau.

Muaj qee qhov essence. Cia muaj Contact. Muaj cov ntawv nrog lub cev qauv, los ntawm cov parser thiab hydrator tsim cov tib neeg sib cuag. Ib tsab ntawv tuaj txog, peb nyeem nws, faib nws mus rau hauv qhov tseem ceeb-tus khub, tsim kev sib cuag, thiab khaws cia rau hauv cov ntaub ntawv.

Nws yog theem pib. Wb hais tias ib tug hu muaj cov khoom Tag Nrho Lub Npe, Hnub Nyoog thiab Hu Xov Tooj. Cov ntaub ntawv no raug xa mus rau hauv tsab ntawv. Lub lag luam tseem xav tau kev txhawb nqa kom muaj peev xwm ntxiv cov yuam sij tshiab sai sai rau daim phiaj xwm chaw ua haujlwm ua khub hauv lub cev ntawm tsab ntawv. Nyob rau hauv cov ntaub ntawv ib tug neeg ua ib tug typo nyob rau hauv lub template los yog yog hais tias ua ntej qhov kev tso tawm nws yog tsim nyog los maj mam pib daim ntawv qhia los ntawm ib tug tshiab tus khub, hloov mus rau lub tshiab hom ntawv. Tom qab ntawd peb tuaj yeem ntxiv ib daim ntawv qhia kev sib raug zoo raws li qhov pheej yig datafix. Qhov ntawd yog, piv txwv li lub neej.

Peb siv, tsim cov kev xeem. Ua haujlwm.

Kuv yuav tsis muab cov cai: muaj ntau qhov chaw, thiab lawv muaj nyob rau ntawm GitHub ntawm qhov txuas ntawm qhov kawg ntawm tsab xov xwm. Koj tuaj yeem thauj lawv, tsim txom lawv dhau qhov kev lees paub thiab ntsuas lawv, raws li nws yuav cuam tshuam rau koj rooj plaub. Kuv tsuas yog muab cov cai ntawm ob lub qauv qauv uas paub qhov txawv ntawm lub hydrator, uas yuav tsum tau ceev ceev, los ntawm lub hydrator, uas yuav tsum tau qeeb.

Cov logic yog raws li nram no: cov qauv qauv tau txais cov khub tsim los ntawm qhov yooj yim parser logic. LINQ txheej yog qhov parser thiab cov ntsiab lus yooj yim ntawm lub hydrator, uas ua rau kev thov rau cov ntsiab lus ntawm cov ntaub ntawv thiab sib piv cov yuam sij nrog cov khub los ntawm parser (rau cov haujlwm no muaj cov lej tsis muaj LINQ rau kev sib piv). Tom ntej no, cov khub raug xa mus rau lub ntsiab hydration txoj kev thiab qhov tseem ceeb ntawm cov khub yog teem rau cov khoom sib xws ntawm qhov chaw.

"Fast" (Prefix Fast hauv cov qauv):

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

Raws li peb tuaj yeem pom, kev sau zoo li qub nrog cov cuab yeej setter yog siv - muab tso ua ke lambdas uas hu rau lub chaw teeb tsa. Tsim los ntawm cov cai hauv qab no:

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

Feem ntau nws yog qhov tseeb. Peb hla cov khoom, tsim delegates rau lawv uas hu setters, thiab txuag lawv. Ces peb hu thaum tsim nyog.

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

Ntawm no peb tam sim hla cov khoom thiab hu rau SetValue ncaj qha.

Kom meej thiab raws li ib tug siv, kuv siv ib tug naive txoj kev uas sau qhov tseem ceeb ntawm lawv correlation khub ncaj qha mus rau hauv lub chaw ua hauj lwm. Prefix - Phau ntawv.

Tam sim no cia peb coj BenchmarkDotNet thiab tshuaj xyuas qhov ua tau zoo. Thiab mam li nco dheev ... (spoiler - qhov no tsis yog qhov tseeb, cov ntsiab lus hauv qab no)

Kab lus tsis ua tiav txog kev xav nrawm nrawm

Peb pom dab tsi ntawm no? Cov txheej txheem uas kov yeej Fast prefix tig tawm kom qeeb qeeb hauv yuav luag txhua qhov hla dhau txoj hauv kev nrog Slow prefix. Qhov no muaj tseeb rau ob qho tib si faib thiab kev ua haujlwm ceev. Ntawm qhov tod tes, kev ua kom zoo nkauj thiab zoo nkauj ntawm daim duab qhia siv LINQ txoj kev npaj rau qhov no txhua qhov chaw ua tau, ntawm qhov tsis sib xws, txo cov khoom tsim tau zoo heev. Qhov txawv yog ntawm kev txiav txim. Qhov sib txawv tsis hloov nrog cov lej sib txawv. Qhov txawv tsuas yog nyob rau hauv scale. Nrog LINQ nws yog 4 - 200 lub sij hawm qeeb, muaj cov khib nyiab ntau dua ntawm kwv yees li tib qhov teev.

TSHIAB

Kuv tsis ntseeg kuv lub qhov muag, tab sis qhov tseem ceeb tshaj, peb cov npoj yaig tsis ntseeg kuv ob lub qhov muag lossis kuv tus lej - Dmitry Tikhonov 0x1000000. Tau tshawb xyuas kuv qhov kev daws teeb meem ob zaug, nws tau tshawb pom thiab taw qhia qhov ua yuam kev uas kuv tau ploj mus vim muaj ntau yam kev hloov pauv hauv kev siv, pib mus rau qhov kawg. Tom qab kho qhov pom kab laum hauv Moq teeb, tag nrho cov txiaj ntsig tau poob rau hauv qhov chaw. Raws li cov txiaj ntsig rov qab, cov qauv tseem ceeb tsis hloov pauv - LINQ tseem cuam tshuam kev ua haujlwm ntau dua li kev xav. Txawm li cas los xij, nws yog qhov zoo uas kev ua haujlwm nrog Kev Tshaj Tawm muab tso ua ke tsis ua tiav, thiab qhov tshwm sim yog pom ob qho tib si hauv kev faib thiab sijhawm ua tiav. Thawj qhov kev tso tawm, thaum thaj chaw zoo li qub tau pib, yog qhov qeeb qeeb rau txoj kev "ceev", tab sis tom qab ntawd qhov xwm txheej hloov.

Nov yog qhov tshwm sim ntawm qhov kev xeem rov qab:

Kab lus tsis ua tiav txog kev xav nrawm nrawm

Xaus: thaum siv kev xav hauv kev lag luam, tsis muaj qhov tshwj xeeb yuav tsum tau siv dag zog - LINQ yuav noj cov khoom tsim tau ntau dua. Txawm li cas los xij, nyob rau hauv cov txheej txheem siab load uas yuav tsum tau ua kom zoo, koj tuaj yeem txuag kev xav hauv daim ntawv ntawm cov pib thiab cov neeg sawv cev compilers, uas yuav muab "ceev" logic. Txoj kev no koj tuaj yeem tswj tau qhov yooj yim ntawm kev xav thiab ceev ntawm daim ntawv thov.

Tus qauv code muaj nyob ntawm no. Leej twg tuaj yeem tshawb xyuas kuv cov lus:
HabraReflectionTests

PS: cov cai hauv qhov kev sim siv IoC, thiab hauv cov qauv ntsuas nws siv qhov kev tsim tshwj xeeb. Qhov tseeb yog tias hauv kev ua tiav zaum kawg kuv txiav tawm txhua yam uas tuaj yeem cuam tshuam rau kev ua haujlwm thiab ua rau qhov tshwm sim nrov.

PPS: Ua tsaug rau tus neeg siv Dmitry Tikhonov @0x1000000 rau nrhiav pom kuv qhov yuam kev hauv kev teeb tsa Moq, uas cuam tshuam rau thawj qhov kev ntsuas. Yog hais tias ib tug ntawm cov nyeem muaj txaus karma, thov nyiam nws. Tus txiv neej nres, tus txiv neej nyeem, tus txiv neej ob-kos thiab taw qhia qhov yuam kev. Kuv xav tias qhov no tsim nyog rau kev hwm thiab kev khuv leej.

PPPS: ua tsaug rau tus nyeem ntawv zoo uas tau txais mus rau hauv qab ntawm cov style thiab tsim. Kuv yog rau uniformity thiab yooj yim. Lub diplomacy ntawm kev nthuav qhia tawm ntau yam uas xav tau, tab sis kuv coj qhov kev thuam rau hauv tus account. Kuv thov rau qhov projectile.

Tau qhov twg los: www.hab.com

Ntxiv ib saib