Alt nár éirigh leis faoi luathú machnaimh

Míneoidh mé teideal an ailt láithreach. Ba é an bunphlean ná comhairle mhaith iontaofa a thabhairt maidir le conas úsáid an mhachnaimh a bhrostú ag baint úsáide as sampla simplí ach réalaíoch, ach le linn tagarmharcála d’éirigh sé amach nach bhfuil an machnamh chomh mall agus a cheap mé, tá LINQ níos moille ná mar a bhí i mo thromluí. Ach sa deireadh d'éirigh sé amach go ndearna mé botún freisin sna tomhais ... Tá sonraí an scéal saoil seo faoi bhrú agus sna tuairimí. Ós rud é go bhfuil an sampla sách coitianta agus curtha i bhfeidhm i bprionsabal mar a dhéantar de ghnáth i bhfiontar, d'éirigh sé go leor suimiúil, mar a fheictear domsa, léiriú ar an saol: ba é an tionchar ar luas príomhábhar an ailt. nach bhfuil faoi deara mar gheall ar loighic sheachtrach: Moq, Autofac, EF Core agus daoine eile "strapaí".

Thosaigh mé ag obair faoi tuiscint an ailt seo: Cén fáth a bhfuil Machnamh mall

Mar a fheiceann tú, molann an t-údar úsáid a bhaint as toscairí tiomsaithe in ionad modhanna cineál machnaimh a ghlaoch go díreach mar bhealach iontach chun an t-iarratas a bhrostú go mór. Ar ndóigh, tá astaíocht IL ann, ach ba mhaith liom é a sheachaint, ós rud é gurb é seo an bealach is déine ar shaothar chun an tasc a chomhlíonadh, atá lán le hearráidí.

Ag cur san áireamh go raibh tuairim chomhchosúil agam i gcónaí faoi luas an mhachnaimh, ní raibh sé i gceist agam ach go háirithe conclúidí an údair a cheistiú.

Is minic a bhuailim úsáid naive machnaimh san fhiontar. Tógtar an cineál. Glactar eolas faoin maoin. Tugtar modh SetValue agus bíonn áthas ar gach duine. Tá an luach tar éis teacht ar an spriocréimse, tá gach duine sásta. Scríobhann daoine an-chliste – seanóirí agus ceannairí foirne – a gcuid síntí chun réada a dhéanamh, agus iad bunaithe ar mhapáil “uilíoch” cur i bhfeidhm den sórt sin naive de chineál amháin go ceann eile. Is é seo an bunúsach de ghnáth: tógann muid na réimsí go léir, tógaimid na hairíonna go léir, athrá orthu: má thagann ainmneacha na gcomhaltaí cineáil, déanaimid SetValue a fhorghníomhú. Ó am go chéile glacaimid eisceachtaí mar gheall ar bhotúin nuair nach bhfuair muid roinnt maoine i gceann de na cineálacha, ach fiú anseo tá bealach amach a fheabhsaíonn feidhmíocht. Bain triail as/ghabháil.

Chonaic mé daoine ag athchruthú parsálaithe agus mapálaithe gan a bheith lán-armtha le faisnéis faoin gcaoi a n-oibríonn na meaisíní a tháinig rompu. Tá daoine feicthe agam a gcuid feidhmeanna naive a cheilt taobh thiar de straitéisí, taobh thiar de chomhéadain, taobh thiar d'instealltaí, amhail is dá mba leithscéal é seo an bacchanalia ina dhiaidh sin. Chas mé mo shrón suas ag réaduithe den sórt sin. Déanta na fírinne, níor thomhais mé an fíor-sceitheadh ​​feidhmíochta, agus, más féidir, d'athraigh mé an cur i bhfeidhm go dtí ceann níos “optamúla” dá bhféadfainn mo lámha a fháil air. Mar sin, chuir na chéad tomhais a phléitear thíos mearbhall mór orm.

Sílim go bhfuil go leor agaibh, ag léamh Richter nó idé-eolaithe eile, tar éis teacht ar ráiteas iomlán cothrom gur feiniméan é machnamh i gcód a mbíonn tionchar thar a bheith diúltach aige ar fheidhmíocht an fheidhmchláir.

Má chuirtear glaoch ar mhachnamh, cuireann sé iallach ar an CLR dul trí thionóil chun an ceann a theastaíonn uathu a aimsiú, a meiteashonraí a tharraingt suas, iad a pharsáil, etc. Ina theannta sin, mar thoradh ar mhachnamh agus seichimh trasnaithe á gcur i gcrích, leithdháileadh méid mór cuimhne. Táimid ag baint leasa as cuimhne, nochtann CLR an GC agus cuirtear tús le fríosanna. Ba chóir go mbeadh sé suntasach mall, creidim dom. Ní chuireann na méideanna ollmhóra cuimhne ar fhreastalaithe táirgeachta nua-aimseartha nó ar mheaisíní scamall cosc ​​​​ar mhoilleanna próiseála ard. Go deimhin, dá mhéad cuimhne is ea is dóichí go dtabharfaidh tú Fógra faoi conas a oibríonn an GC. Go teoiriciúil, is ceirt dearg breise é machnamh.

Mar sin féin, bainimid go léir úsáid as coimeádáin IoC agus mapálaithe dáta, a bhfuil a phrionsabal oibriúcháin bunaithe freisin ar mhachnamh, ach de ghnáth níl aon cheist maidir lena bhfeidhmíocht. Ní hea, toisc go bhfuil an oiread sin riachtanach le tabhairt isteach spleáchais agus astarraingt ó shamhlacha comhthéacs teoranta seachtracha go gcaithfimid feidhmíocht a íobairt ar aon nós. Tá gach rud níos simplí - ní chuireann sé isteach ar fheidhmíocht i ndáiríre.

Is é fírinne an scéil go n-úsáideann na creataí is coitianta atá bunaithe ar theicneolaíocht machnaimh gach cineál cleas chun oibriú leis ar bhealach níos fearr. De ghnáth is taisce é seo. Go hiondúil is Nathanna cainte agus toscairí iad seo a chuirtear le chéile ón gcrann abairte. Coinníonn an t-uathmhapadóir céanna foclóir iomaíoch a mheaitseálann cineálacha le feidhmeanna ar féidir leo ceann a thiontú go ceann eile gan machnamh a ghlaoch.

Conas a dhéantar é seo a bhaint amach? Go bunúsach, níl sé seo difriúil leis an loighic a úsáideann an t-ardán féin chun cód JIT a ghiniúint. Nuair a ghlaoitear modh den chéad uair, déantar é a thiomsú (agus, tá, níl an próiseas seo go tapa); ar ghlaonna ina dhiaidh sin, aistrítear rialú chuig an modh a tiomsaíodh cheana féin, agus ní bheidh aon tarraingtí feidhmíochta suntasacha ann.

Inár gcás, is féidir leat tiomsú JIT a úsáid freisin agus ansin an t-iompar tiomsaithe a úsáid leis an bhfeidhmíocht chéanna lena gcomhghleacaithe AOT. Tiocfaidh nathanna cainte chun ár gcabhair sa chás seo.

Is féidir an prionsabal atá i gceist a fhoirmiú go hachomair mar seo a leanas:
Ba cheart duit an toradh deiridh machnaimh a thaisceadh mar thoscaire ina bhfuil an fheidhm tiomsaithe. Déanann sé ciall freisin gach réad riachtanach a thaisceadh le faisnéis chineáil sna réimsí de do chineál, an t-oibrí, a stóráiltear lasmuigh de na rudaí.

Tá loighic leis seo. Insíonn tuiscint coiteann dúinn más féidir rud éigin a chur le chéile agus a thaisceadh, ba chóir é a dhéanamh.

Ag féachaint amach romhainn, ba chóir a rá go bhfuil buntáistí ag baint leis an taisce agus é ag obair le machnamh, fiú mura n-úsáideann tú an modh atá beartaithe chun nathanna cainte a thiomsú. I ndáiríre, níl anseo ach tráchtais údair an ailt dá dtagraíonn mé thuas a athrá anseo.

Anois faoin gcód. Breathnaímid ar shampla atá bunaithe ar an bpian a bhí agam le déanaí a bhí orm aghaidh a thabhairt ar institiúid chreidmheasa thromchúiseach a tháirgeadh. Tá gach aonán bréige ionas nach ndéanfadh aon duine buille faoi thuairim.

Tá bunúsach éigin ann. Bíodh Teagmháil ann. Tá litreacha ann le comhlacht caighdeánaithe, as a chruthaíonn an parsálaí agus an hiodráiteoir na teagmhálacha céanna seo. Tháinig litir, léigheamar í, rinneamar í a pharsáil ina mbeirteanna eochairluacha, cruthaíodh teagmhálaí, agus shábháil muid sa bhunachar í.

Tá sé bunrang. Ligean le rá go bhfuil na hairíonna ag teagmhálaí Ainm Iomlán, Aois agus Fón Teagmhála. Tarchuirtear na sonraí seo sa litir. Teastaíonn tacaíocht ón ngnó freisin le go mbeidh sé in ann eochracha nua a chur isteach go tapa chun airíonna aonáin a mhapáil ina mbeirteanna i gcorp na litreach. I gcás go ndearna duine éigin clóscríobh sa teimpléad nó más rud é roimh an scaoileadh is gá mapáil ó chomhpháirtí nua a sheoladh go práinneach, ag oiriúnú don fhormáid nua. Ansin is féidir linn comhghaol mapála nua a chur leis mar shocrú sonraí saor. Is é sin, sampla saoil.

Cuirimid i bhfeidhm, cruthaímid tástálacha. Oibríonn.

Ní sholáthróidh mé an cód: tá go leor foinsí ann, agus tá siad ar fáil ar GitHub tríd an nasc ag deireadh an ailt. Is féidir leat iad a luchtú, iad a chéasadh thar aitheantas agus iad a thomhas, mar a bheadh ​​tionchar aige i do chás. Ní thabharfaidh mé ach cód dhá mhodh teimpléid a dhéanann idirdhealú ar an hiodrator, a bhí ceaptha a bheith go tapa, ón hiodrator, a bhí ceaptha a bheith mall.

Is é seo a leanas an loighic: faigheann an modh teimpléad péirí ginte ag an loighic parsálaí bhunúsach. Is é an ciseal LINQ an parsálaí agus an loighic bhunúsach an hydrator, a dhéanann iarratas chuig an gcomhthéacs bunachar sonraí agus a chur i gcomparáid eochracha le péirí as an parsálaí (do na feidhmeanna seo tá cód gan LINQ le haghaidh comparáide). Ansin, cuirtear na péirí ar aghaidh chuig an bpríomh-mhodh hiodráitithe agus socraítear luachanna na mbeirteanna ar airíonna comhfhreagracha an eintitis.

“Fast” (Réimír Fast i tagarmharcanna):

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

Mar is féidir linn a fheiceáil, úsáidtear bailiúchán statach le hairíonna socraitheoirí - lambdas tiomsaithe a ghlaonn an t-eintiteas socraitheoir. Cruthaithe ag an gcód seo a leanas:

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

Go ginearálta tá sé soiléir. Trasnaíonn muid na hairíonna, cruthaímid toscairí dóibh a ghlaonn socraitheoirí, agus a shábhálann iad. Ansin glaoimid nuair is gá.

“Mall” (Réimír Mall sna tagarmharcanna):

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

Anseo seachnaíonn muid na hairíonna láithreach agus glaoimid ar SetValue go díreach.

Ar mhaithe le soiléireacht agus mar thagairt, chuir mé modh naive i bhfeidhm a scríobhann luachanna a bpéirí comhghaoil ​​go díreach isteach sna réimsí eintiteas. Réimír - Lámhleabhar.

Anois, déanaimis BenchmarkDotNet a ghlacadh agus an fheidhmíocht a scrúdú. Agus go tobann ... (spoiler - ní hé seo an toradh ceart, tá sonraí thíos)

Alt nár éirigh leis faoi luathú machnaimh

Cad a fheiceann muid anseo? Na modhanna a iompraíonn an réimír Mear go buacach bíonn siad níos moille i mbeagnach gach pas ná modhanna leis an réimír Mear. Tá sé seo fíor maidir le leithdháileadh agus luas na hoibre araon. Ar an láimh eile, má dhéantar léarscáiliú álainn agus galánta a chur i bhfeidhm ag baint úsáide as modhanna LINQ atá beartaithe dó seo nuair is féidir, ar a mhalairt, laghdaítear táirgiúlacht go mór. Tá an difríocht in ord. Ní athraíonn an treocht le líon éagsúil pasanna. Is é an difríocht amháin i scála. Le LINQ tá sé 4 - 200 uair níos moille, tá níos mó truflais ar thart ar an scála céanna.

Updated

Níor chreid mé mo shúile, ach níos tábhachtaí fós, níor chreid ár gcomhghleacaí mo shúile ná mo chód - Dmitry Tikhonov 0x1000000. Tar éis dó mo réiteach a sheiceáil faoi dhó, fuair sé amach go hiontach earráid a theip orm mar gheall ar roinnt athruithe ar an gcur i bhfeidhm, ó thús deireadh go dtí an ceann deireanach, agus chuir sé in iúl é. Tar éis an fabht aimsithe a shocrú i socrú Moq, thit na torthaí go léir i bhfeidhm. De réir na dtorthaí retest, ní athraíonn an príomh-threocht - tá tionchar ag LINQ fós ar fheidhmíocht níos mó ná machnamh. Mar sin féin, tá sé go deas nach bhfuil an obair le tiomsú Slonn déanta go neamhbhalbh, agus tá an toradh le feiceáil san am leithdháilte agus cur i gcrích. Tá an chéad seoladh, nuair a chuirtear tús le réimsí statacha, go nádúrtha níos moille don mhodh “tapa”, ach ansin athraíonn an scéal.

Seo toradh na hathtástála:

Alt nár éirigh leis faoi luathú machnaimh

Conclúid: agus machnamh á úsáid i ngnóthas, níl aon ghá ar leith dul i muinín cleasanna - íosfaidh LINQ táirgiúlacht níos mó. Mar sin féin, ar mhodhanna ard-ualaigh a dteastaíonn barrfheabhsú uathu, is féidir leat machnamh a shábháil i bhfoirm tosaithe agus tiomsaitheoirí toscairí, a sholáthróidh loighic “tapa” ansin. Ar an mbealach seo is féidir leat solúbthacht machnaimh agus luas an iarratais a choinneáil.

Tá an cód tagarmharcála ar fáil anseo. Is féidir le haon duine mo chuid focal a sheiceáil faoi dhó:
HabraReflectionTests

PS: úsáideann an cód sna tástálacha IoC, agus sna tagarmharcanna úsáideann sé tógáil sainráite. Is é an fírinne gur ghearr mé amach sa chur i bhfeidhm deiridh na fachtóirí go léir a d'fhéadfadh cur isteach ar fheidhmíocht agus an toradh a dhéanamh torannach.

PPS: Buíochas leis an úsáideoir Dmitry Tikhonov @ 0x1000000 as mo earráid a fháil amach maidir le Moq a bhunú, rud a chuir isteach ar na chéad tomhais. Má tá a dhóthain karma ag aon cheann de na léitheoirí, maith leat é. Stop an fear, léigh an fear, rinne an fear a sheiceáil faoi dhó agus léirigh sé an botún. Sílim gur fiú meas agus comhbhrón a thabhairt dó seo.

PPPS: buíochas leis an léitheoir mionchúiseach a fuair bun an stíl agus an dearadh. Táim ar son aonfhoirmeachta agus áise. Fágann taidhleoireacht an chur i láthair go leor le bheith inmhianaithe, ach chuir mé an cáineadh san áireamh. Iarraim an teilgean.

Foinse: will.com

Add a comment