Artaigil neo-shoirbheachail mu bhith a 'luathachadh meòrachadh

Mìnichidh mi tiotal an artaigil sa bhad. B’ e am plana tùsail comhairle mhath, earbsach a thoirt seachad mu bhith a’ luathachadh cleachdadh meòrachaidh le bhith a’ cleachdadh eisimpleir shìmplidh ach reusanta, ach aig àm slat-tomhais thionndaidh e a-mach nach eil meòrachadh cho slaodach sa bha mi a’ smaoineachadh, tha LINQ nas slaodaiche na anns na trom-laighe agam. Ach aig a’ cheann thall thionndaidh e a-mach gun do rinn mi mearachd cuideachd anns na tomhais... Tha mion-fhiosrachadh mun sgeulachd beatha seo fon ghearradh agus anns na beachdan. Leis gu bheil an eisimpleir gu math cumanta agus air a chuir an gnìomh ann am prionnsapal mar a tha mar as trice air a dhèanamh ann an iomairt, thionndaidh e a-mach gu bhith na thaisbeanadh gu math inntinneach, mar a tha e coltach riumsa, air beatha: b ’e a’ bhuaidh air astar prìomh chuspair an artaigil nach eil follaiseach air sgàth loidsig bhon taobh a-muigh: Moq, Autofac, EF Core agus "còmhlan" eile.

Thòisich mi ag obair fo bheachd an artaigil seo: Carson a tha Cnuasachadh slaodach

Mar a chì thu, tha an t-ùghdar a’ moladh a bhith a’ cleachdadh riochdairean cruinnichte an àite a bhith a’ gairm dhòighean seòrsa meòrachaidh gu dìreach mar dhòigh math air an tagradh a luathachadh gu mòr. Tha, gu dearbh, sgaoilidhean IL, ach bu mhath leam a sheachnadh, oir is e seo an dòigh as dian air obair a choileanadh, a tha làn mhearachdan.

Leis gu robh mi an-còmhnaidh air a bhith den aon bheachd mu astar a’ mheòrachadh, cha robh dùil agam gu sònraichte co-dhùnaidhean an ùghdair a cheasnachadh.

Bidh mi tric a’ tighinn tarsainn air cleachdadh naive de mheòrachadh san iomairt. Tha an seòrsa air a ghabhail. Thathas a’ gabhail fiosrachadh mun togalach. Canar modh SetValue ris agus bidh a h-uile duine a’ dèanamh gàirdeachas. Tha an luach air ruighinn san raon targaid, tha a h-uile duine toilichte. Bidh daoine gu math sgiobalta - seann daoine agus stiùirichean sgioba - a’ sgrìobhadh na leudachain aca gu rud, a’ stèidheachadh air a leithid de chur an gnìomh naive mappers “uile-choitcheann” de aon sheòrsa gu seòrsa eile. Is e seo a’ bhunait mar as trice: bidh sinn a’ toirt a h-uile raon, a’ gabhail a h-uile seilbh, ag ath-aithris thairis orra: ma tha ainmean an seòrsa buill a’ maidseadh, bidh sinn a’ cur an gnìomh SetValue. Bho àm gu àm bidh sinn a 'glacadh eisgeachdan air sgàth mhearachdan far nach do lorg sinn cuid de mhaoin ann an aon de na seòrsaichean, ach eadhon an seo tha slighe a-mach a leasaicheas coileanadh. Feuch/glacadh.

Tha mi air daoine fhaicinn ag ath-chruthachadh parsers agus mappers gun a bhith làn armachd le fiosrachadh mu mar a tha na h-innealan a thàinig romhpa ag obair. Tha mi air daoine fhaicinn a’ falach am buileachadh naive air cùl ro-innleachdan, air cùl eadar-aghaidh, air cùl in-stealladh, mar gum biodh seo na leisgeul don bacchanalia às deidh sin. Thionndaidh mi mo shròin aig a leithid de choileanadh. Gu dearbh, cha do thomhais mi an fhìor aodion coileanaidh, agus, ma bha e comasach, dh’ atharraich mi am buileachadh gu fear nas “as fheàrr” nam faigheadh ​​​​mi mo làmhan air. Mar sin, chuir na ciad tomhasan air an deach beachdachadh gu h-ìosal dragh mòr orm.

Tha mi a’ smaoineachadh gu bheil mòran agaibh, a’ leughadh Richter no ideòlaichean eile, air tighinn tarsainn air aithris gu tur cothromach gu bheil meòrachadh ann an còd na iongantas a bheir droch bhuaidh air coileanadh an tagraidh.

Le bhith a’ gairm meòrachadh a’ toirt air an CLR a dhol tro cho-chruinneachaidhean gus am fear a tha a dhìth orra a lorg, am meata-dàta a tharraing suas, am parsadh, msaa. A bharrachd air an sin, bidh meòrachadh fhad ‘s a tha thu a’ dol thairis air sreathan a ’leantainn gu riarachadh mòran cuimhne. Tha sinn a’ cleachdadh cuimhne, tha CLR a’ faighinn a-mach an GC agus bidh frisean a’ tòiseachadh. Bu chòir dha a bhith gu math slaodach, creid mi. Chan eil na h-àireamhan mòra de chuimhne air frithealaichean cinneasachaidh ùr-nodha no innealan sgòthan a’ cur casg air dàil giollachd àrd. Gu dearbh, mar as motha de chuimhne, is ann as dualtaiche a bhios tu FIOS mar a tha an GC ag obair. Tha meòrachadh, ann an teòiridh, na rag dearg a bharrachd dha.

Ach, bidh sinn uile a’ cleachdadh soithichean IoC agus mapaichean ceann-latha, agus tha am prionnsapal obrachaidh aca cuideachd stèidhichte air meòrachadh, ach mar as trice chan eil ceistean sam bith mun coileanadh aca. Chan e, chan ann air sgàth gu bheil toirt a-steach eisimeileachd agus toirt air falbh bho mhodalan co-theacsa cuibhrichte taobh a-muigh cho riatanach is gum feum sinn coileanadh a ìobairt co-dhiù. Tha a h-uile dad nas sìmplidh - chan eil e a 'toirt buaidh mhòr air coileanadh.

Is e an fhìrinn gu bheil na frèaman as cumanta a tha stèidhichte air teicneòlas meòrachaidh a 'cleachdadh a h-uile seòrsa cleas gus obrachadh leis nas fheàrr. Mar as trice is e tasgadan a tha seo. Mar as trice is iad sin Aithrisean agus riochdairean air an cur ri chèile bhon chraobh abairt. Bidh an aon automapper a 'cumail faclair farpaiseach a tha a' maidseadh seòrsaichean le gnìomhan a dh'fhaodas fear a thionndadh gu fear eile gun a bhith a 'gairm meòrachadh.

Ciamar a tha seo air a choileanadh? Gu bunaiteach, chan eil seo eadar-dhealaichte bhon reusanachadh a bhios an àrd-ùrlar fhèin a’ cleachdadh gus còd JIT a ghineadh. Nuair a thèid modh a ghairm airson a 'chiad uair, tha e air a chur ri chèile (agus, tha, chan eil am pròiseas seo luath); air fiosan às dèidh sin, thèid smachd a ghluasad chun an dòigh a chaidh a chur ri chèile mar-thà, agus cha bhi lùghdachadh coileanaidh cudromach ann.

Anns a ’chùis againn, faodaidh tu cuideachd cruinneachadh JIT a chleachdadh agus an uairsin an giùlan cruinnichte a chleachdadh leis an aon choileanadh ris na co-aoisean AOT agad. Thig briathran gu ar cuideachadh anns a' chùis so.

Faodar am prionnsapal sin a dhealbhadh gu h-aithghearr mar a leanas:
Bu chòir dhut an toradh mu dheireadh de mheòrachadh a thasgadh mar riochdaire anns a bheil an gnìomh cruinnichte. Tha e cuideachd ciallach a h-uile nì riatanach a thasgadh le fiosrachadh seòrsa anns na raointean den t-seòrsa agad, an neach-obrach, a tha air a stòradh taobh a-muigh nan nithean.

Tha loidsig ann an seo. Tha ciall cumanta ag innse dhuinn ma ghabhas rudeigin a chuir ri chèile agus a thasgadh, gum bu chòir a dhèanamh.

A’ coimhead air adhart, bu chòir a ràdh gu bheil na buannachdan aig an tasgadan ann a bhith ag obair le meòrachadh, eadhon ged nach cleachd thu an dòigh a thathar a’ moladh airson abairtean a chur ri chèile. Gu fìrinneach, an seo tha mi dìreach ag ath-aithris tràchdasan ùghdar an artaigil air a bheil mi a’ toirt iomradh gu h-àrd.

A-nis mun chòd. Bheir sinn sùil air eisimpleir a tha stèidhichte air a’ phian a bh’ agam o chionn ghoirid a dh’ fheumadh a bhith orm ann an toradh trom de dhroch institiud creideas. Tha a h-uile eintiteas meallta gus nach dèanadh duine tomhas.

Tha beagan brìgh ann. Leig le Contact a bhith ann. Tha litrichean ann le bodhaig àbhaisteach, às am bi am parser agus an hydrator a’ cruthachadh na h-aon cheanglaichean sin. Ràinig litir, leugh sinn e, rannsaich sinn i ann am paidhrichean prìomh luach, chruthaich sinn ceangal, agus shàbhail sinn e san stòr-dàta.

Tha e bunasach. Canaidh sinn gu bheil na togalaichean aig neach-fios Làn Ainm, Aois agus Fòn Fios. Tha an dàta seo air a ghluasad anns an litir. Tha an gnìomhachas cuideachd ag iarraidh taic gus a bhith comasach air iuchraichean ùra a chuir ris gu sgiobalta airson togalaichean eintiteas a mhapadh ann an càraidean ann am bodhaig na litreach. Ma tha cuideigin air typo a dhèanamh san teamplaid no ma tha e riatanach mapadh bho chom-pàirtiche ùr a chuir air bhog gu h-èiginneach, ag atharrachadh a rèir an cruth ùr. An uairsin is urrainn dhuinn co-dhàimh mapaidh ùr a chuir ris mar datafix saor. Is e sin, eisimpleir de bheatha.

Bidh sinn a 'cur an gnìomh, a' cruthachadh dheuchainnean. Obraichean.

Cha toir mi seachad an còd: tha tòrr stòran ann, agus tha iad rim faighinn air GitHub tron ​​​​cheangal aig deireadh an artaigil. Faodaidh tu an luchdachadh, an cràdh thar aithne agus an tomhas, mar a bheireadh e buaidh nad chùis. Cha toir mi ach còd dà dhòigh teamplaid a nì eadar-dhealachadh air an hydrator, a bha còir a bhith luath, bhon hydrator, a bha còir a bhith slaodach.

Tha an loidsig mar a leanas: tha an dòigh teamplaid a 'faighinn paidhrichean air an cruthachadh leis an loidsig parser bunaiteach. Is e an còmhdach LINQ am parser agus loidsig bunaiteach an hydrator, a nì iarrtas gu co-theacs an stòr-dàta agus a nì coimeas eadar iuchraichean le paidhrichean bhon pharser (airson na gnìomhan sin tha còd gun LINQ airson coimeas). An uairsin, thèid na paidhrichean a chuir chun phrìomh dhòigh uisgeachaidh agus tha luachan nan càraidean air an suidheachadh a rèir feartan co-fhreagarrach an eintiteas.

“Fast” (Ro-leasachan Fast ann an slatan-tomhais):

 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 a chì sinn, thathas a’ cleachdadh cruinneachadh statach le feartan seatater - lambdas air a chuir ri chèile a chanas an eintiteas setter. Air a chruthachadh leis a’ chòd 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();
        }

San fharsaingeachd tha e soilleir. Bidh sinn a’ dol thairis air na togalaichean, a’ cruthachadh riochdairean dhaibhsan a bhios a’ gairm luchd-rèiteachaidh, agus gan sàbhaladh. An uairsin bidh sinn a 'gairm nuair a bhios feum air.

“Mall” (Ro-leasachan slaodach ann an slatan-tomhais):

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

An seo thèid sinn seachad air na togalaichean sa bhad agus cuir fios gu SetValue gu dìreach.

Airson soilleireachd agus mar iomradh, chuir mi an gnìomh dòigh naive a bhios a’ sgrìobhadh luachan nan paidhrichean co-dhàimh aca gu dìreach a-steach do na raointean eintiteas. Ro-leasachan - Stiùireadh.

A-nis gabhamaid BenchmarkDotNet agus dèan sgrùdadh air a’ choileanadh. Agus gu h-obann ... (spoiler - chan e seo an toradh ceart, tha mion-fhiosrachadh gu h-ìosal)

Artaigil neo-shoirbheachail mu bhith a 'luathachadh meòrachadh

Dè a chì sinn an seo? Tha dòighean anns a bheil an ro-leasachan Fast gu buadhach a’ tionndadh a-mach gu bhith nas slaodaiche anns cha mhòr a h-uile pas na dòighean leis an ro-leasachan Slow. Tha seo fìor airson an dà chuid riarachadh agus astar na h-obrach. Air an làimh eile, tha buileachadh breagha agus eireachdail de mhapadh a’ cleachdadh dhòighean LINQ a tha san amharc airson seo far an gabh sin dèanamh, air an làimh eile, a’ lughdachadh cinneasachd gu mòr. Tha an diofar ann an òrdugh. Chan eil an gluasad ag atharrachadh le àireamhan eadar-dhealaichte de bhealaich. Tha an aon eadar-dhealachadh ann an sgèile. Le LINQ tha e 4 - 200 uair nas slaodaiche, tha barrachd sgudal timcheall air an aon sgèile.

UPDATED

Cha robh mi a’ creidsinn mo shùilean, ach nas cudromaiche, cha robh ar co-obraiche a’ creidsinn mo shùilean no mo chòd - Dmitry Tikhonov 0x1000000. Às deidh dha sgrùdadh dùbailte a dhèanamh air an fhuasgladh agam, lorg e gu sgoinneil agus chomharraich e mearachd a bha mi ag ionndrainn air sgàth grunn atharrachaidhean ann am buileachadh, an toiseach chun a’ chuairt dheireannaich. Às deidh dha am biast a chaidh a lorg a chàradh ann an suidheachadh Moq, thuit na toraidhean gu lèir nan àite. A rèir toraidhean an ath-dheuchainn, chan eil am prìomh ghluasad ag atharrachadh - tha LINQ fhathast a’ toirt buaidh air coileanadh nas motha na meòrachadh. Ach, tha e math nach eil an obair le cruinneachadh Expression air a dhèanamh gu dìomhain, agus tha an toradh ri fhaicinn an dà chuid ann an ùine riarachaidh agus cur gu bàs. Tha a’ chiad fhoillseachadh, nuair a thèid raointean statach a thòiseachadh, gu nàdarrach nas slaodaiche airson an dòigh “luath”, ach an uairsin bidh an suidheachadh ag atharrachadh.

Seo toradh an ath-dheuchainn:

Artaigil neo-shoirbheachail mu bhith a 'luathachadh meòrachadh

Co-dhùnadh: nuair a bhios tu a’ cleachdadh meòrachadh ann an iomairt, chan eil feum sònraichte air a dhol gu cleasan - ithidh LINQ cinneasachd nas motha. Ach, ann an dòighean làn luchd a dh’ fheumas optimization, faodaidh tu meòrachadh a shàbhaladh ann an cruth luchd-tòiseachaidh agus luchd-cruinneachaidh riochdairean, a bheir an uairsin loidsig “luath”. San dòigh seo faodaidh tu an dà chuid sùbailteachd meòrachaidh agus astar an tagraidh a chumail suas.

Tha an còd slat-tomhais ri fhaighinn an seo. Faodaidh duine sam bith sùil dhùbailte a thoirt air na faclan agam:
Deuchainnean Meòrachaidh Habra

PS: bidh an còd anns na deuchainnean a’ cleachdadh IoC, agus anns na slatan-tomhais bidh e a’ cleachdadh togail soilleir. Is e an fhìrinn, anns a’ bhuileachadh mu dheireadh, gun do gheàrr mi dheth a h-uile feart a dh’ fhaodadh buaidh a thoirt air coileanadh agus an toradh a dhèanamh fuaimneach.

PPS: Taing don neach-cleachdaidh Dmitry Tikhonov @ 0x1000000 airson faighinn a-mach mun mhearachd agam ann a bhith a’ stèidheachadh Moq, a thug buaidh air a’ chiad tomhas. Ma tha karma gu leòr aig gin den luchd-leughaidh, feuch an toil leat e. Stad an duine, leugh an duine, thug an duine sùil dhùbailte agus chomharraich e am mearachd. Tha mi a 'smaoineachadh gu bheil seo airidh air spèis agus co-fhaireachdainn.

PPPS: taing don leughadair mhionaideach a fhuair gu bonn an stoidhle agus an dealbhadh. Tha mi airson aonachd agus goireasachd. Tha dioplòmasaidh an taisbeanaidh a 'fàgail mòran ri bhith air a mhiannachadh, ach thug mi aire don chàineadh. Bidh mi ag iarraidh an projectile.

Source: www.habr.com

Cuir beachd ann