Nkan ti ko ni aṣeyọri nipa isare isọtẹlẹ

Emi yoo ṣe alaye lẹsẹkẹsẹ akọle nkan naa. Eto atilẹba naa ni lati funni ni imọran ti o dara, ti o gbẹkẹle lori bi o ṣe le yara si lilo iṣaroye nipa lilo apẹẹrẹ ti o rọrun ṣugbọn ti o daju, ṣugbọn lakoko isọdọtun o wa ni jade pe iṣaro ko lọra bi Mo ti ro, LINQ lọra ju ninu awọn alaburuku mi. Ṣugbọn ni ipari o wa ni pe Mo tun ṣe aṣiṣe ni awọn wiwọn ... Awọn alaye ti itan aye yii wa labẹ gige ati ninu awọn asọye. Niwọn igba ti apẹẹrẹ jẹ ibi ti o wọpọ ati imuse ni ipilẹ bi a ṣe n ṣe nigbagbogbo ni ile-iṣẹ kan, o jẹ ohun ti o nifẹ pupọ, bi o ṣe dabi si mi, iṣafihan igbesi aye: ipa lori iyara ti koko-ọrọ akọkọ ti nkan naa jẹ ko ṣe akiyesi nitori imọran ita: Moq, Autofac, EF Core ati awọn miiran "bandings".

Mo bẹrẹ si ṣiṣẹ labẹ imọran nkan yii: Kí nìdí Reflection o lọra

Bii o ti le rii, onkọwe daba ni lilo awọn aṣoju ti o ṣajọpọ dipo pipe awọn ọna iru irisi taara bi ọna nla lati yara ohun elo naa ni iyara. O wa, dajudaju, itusilẹ IL, ṣugbọn Emi yoo fẹ lati yago fun, nitori eyi ni ọna ti o lagbara julọ lati ṣe iṣẹ naa, eyiti o jẹ awọn aṣiṣe.

Ni imọran pe Mo ti nigbagbogbo ni imọran ti o jọra nipa iyara iṣaro, Emi ko ni ipinnu ni pataki lati ṣe ibeere awọn ipinnu onkọwe naa.

Mo nigbagbogbo ba pade lilo aiṣedeede ti iṣaro ni ile-iṣẹ. Iru ti wa ni ya. Alaye nipa ohun ini ti wa ni ya. Ọna SetValue ni a pe ati pe gbogbo eniyan yọ. Iye ti de ni aaye ibi-afẹde, gbogbo eniyan ni idunnu. Awọn eniyan ọlọgbọn pupọ - awọn agbalagba ati awọn oludari ẹgbẹ - kọ awọn amugbooro wọn lati tako, ti o da lori iru imuse aiṣedeede “gbogbo” awọn maapu ti iru kan si omiiran. Koko-ọrọ nigbagbogbo jẹ eyi: a mu gbogbo awọn aaye, mu gbogbo awọn ohun-ini, tun ṣe lori wọn: ti awọn orukọ ti iru awọn ọmọ ẹgbẹ ba baamu, a ṣiṣẹ SetValue. Lati igba de igba a yẹ awọn imukuro nitori awọn aṣiṣe nibiti a ko rii ohun-ini diẹ ninu ọkan ninu awọn oriṣi, ṣugbọn paapaa nibi ọna kan wa ti o mu iṣẹ ṣiṣe dara si. Gbiyanju/mu.

Mo ti rii awọn eniyan ti o tun ṣe awọn olutọpa ati awọn maapu laisi ni kikun ihamọra pẹlu alaye nipa bii awọn ẹrọ ti o wa ṣaaju wọn ṣiṣẹ. Mo ti rii awọn eniyan ti o tọju awọn imuṣẹ aiṣedeede wọn lẹhin awọn ilana, lẹhin awọn atọkun, lẹhin awọn abẹrẹ, bi ẹnipe eyi yoo ṣe awawi fun bacchanalia ti o tẹle. Mo ti yi imu mi soke ni iru awọn oye. Ni otitọ, Emi ko ṣe iwọn jijo iṣẹ ṣiṣe gidi, ati pe, ti o ba ṣeeṣe, Mo kan yipada imuse si “ti aipe” diẹ sii ti MO ba le gba ọwọ mi lori rẹ. Nitorinaa, awọn wiwọn akọkọ ti a jiroro ni isalẹ daamu mi gaan.

Mo ro pe ọpọlọpọ ninu yin, kika Richter tabi awọn onimọ-jinlẹ miiran, ti kọja alaye ododo patapata pe iṣaroye ni koodu jẹ lasan ti o ni ipa odi pupọ lori iṣẹ ohun elo naa.

Itumọ pipe n fi agbara mu CLR lati lọ nipasẹ awọn apejọ lati wa eyi ti wọn nilo, fa metadata wọn soke, ṣe itupalẹ wọn, ati bẹbẹ lọ. Ni afikun, iṣaro lakoko lilọ kiri awọn ọna ṣiṣe yori si ipin ti iye nla ti iranti. A nlo iranti soke, CLR ṣii GC ati awọn friezes bẹrẹ. O yẹ ki o lọra ni akiyesi, gbagbọ mi. Awọn oye nla ti iranti lori awọn olupin iṣelọpọ ode oni tabi awọn ẹrọ awọsanma ko ṣe idiwọ awọn idaduro sisẹ giga. Ni otitọ, iranti diẹ sii, diẹ sii ni o ṣeeṣe ki o ṣe akiyesi bi GC ṣe n ṣiṣẹ. Iṣiro jẹ, ni imọran, afikun rag pupa fun u.

Bibẹẹkọ, gbogbo wa lo awọn apoti IoC ati awọn maapu ọjọ, ipilẹ iṣẹ eyiti o tun da lori iṣaro, ṣugbọn nigbagbogbo ko si awọn ibeere nipa iṣẹ ṣiṣe wọn. Rara, kii ṣe nitori ifihan ti awọn igbẹkẹle ati abstraction lati awọn awoṣe agbegbe lopin lopin jẹ pataki tobẹẹ ti a ni lati rubọ iṣẹ ni eyikeyi ọran. Ohun gbogbo rọrun - ko ni ipa lori iṣẹ ṣiṣe pupọ.

Otitọ ni pe awọn ilana ti o wọpọ julọ ti o da lori imọ-ẹrọ iṣaro lo gbogbo iru awọn ẹtan lati ṣiṣẹ pẹlu rẹ ni aipe. Nigbagbogbo eyi jẹ kaṣe kan. Ni deede iwọnyi jẹ Awọn asọye ati awọn aṣoju ti a ṣajọ lati igi ikosile. Automapper kanna n ṣetọju iwe-itumọ idije ti o baamu awọn oriṣi pẹlu awọn iṣẹ ti o le yi ọkan pada si omiiran laisi pipe iṣaro.

Bawo ni eyi ṣe waye? Ni pataki, eyi ko yatọ si ọgbọn ti pẹpẹ funrararẹ lo lati ṣe ipilẹṣẹ koodu JIT. Nigbati a ba pe ọna kan fun igba akọkọ, o ti ṣajọ (ati, bẹẹni, ilana yii ko yara); lori awọn ipe atẹle, iṣakoso ti gbe lọ si ọna ti a ṣajọ tẹlẹ, ati pe ko si awọn iyasilẹ iṣẹ ṣiṣe pataki.

Ninu ọran wa, o tun le lo akopo JIT ati lẹhinna lo ihuwasi ti a ṣajọpọ pẹlu iṣẹ ṣiṣe kanna gẹgẹbi awọn ẹlẹgbẹ AOT rẹ. Awọn ikosile yoo wa si iranlọwọ wa ninu ọran yii.

Ilana ti o wa ninu ibeere le ṣe agbekalẹ ni ṣoki bi atẹle:
O yẹ ki o ṣaṣeyọri abajade ipari ti iṣaroye bi aṣoju ti o ni iṣẹ ti a ṣakojọpọ ninu. O tun jẹ oye lati kaṣe gbogbo awọn nkan pataki pẹlu iru alaye ni awọn aaye ti iru rẹ, oṣiṣẹ, ti o fipamọ ni ita awọn nkan naa.

Ogbon wa ninu eyi. Imọye ti o wọpọ sọ fun wa pe ti nkan kan ba le ṣe akopọ ati ti fipamọ, lẹhinna o yẹ ki o ṣee.

Wiwa iwaju, o yẹ ki o sọ pe kaṣe ni ṣiṣẹ pẹlu iṣaro ni awọn anfani rẹ, paapaa ti o ko ba lo ọna ti a dabaa ti iṣakojọpọ awọn ọrọ. Lootọ, nibi Mo kan n tun awọn ọrọ ti onkọwe nkan naa ṣe ti Mo tọka si loke.

Bayi nipa koodu naa. Jẹ ki a wo apẹẹrẹ ti o da lori irora aipẹ mi ti Mo ni lati dojuko ni iṣelọpọ pataki ti ile-iṣẹ kirẹditi pataki kan. Gbogbo awọn nkan jẹ arosọ ti ko si ẹnikan yoo gboju.

Nibẹ ni diẹ ninu awọn lodi. Jẹ ki Olubasọrọ wa. Awọn lẹta wa pẹlu ara ti o ni idiwọn, lati eyiti parser ati hydrator ṣẹda awọn olubasọrọ kanna. Lẹta kan de, a ka a, ṣe atuntu rẹ si awọn orisii iye bọtini, ṣẹda olubasọrọ kan, ati fipamọ sinu ibi ipamọ data.

O jẹ alakọbẹrẹ. Jẹ ki a sọ pe olubasọrọ kan ni awọn ohun-ini Orukọ kikun, Ọjọ-ori ati Foonu Olubasọrọ. Yi data ti wa ni zqwq ninu awọn lẹta. Iṣowo naa tun fẹ atilẹyin lati ni anfani lati ṣafikun awọn bọtini tuntun ni iyara fun awọn ohun-ini ẹda aworan si awọn orisii ninu ara ti lẹta naa. Ni ọran ti ẹnikan ba tẹ typo ninu awoṣe tabi ti o ba jẹ pe ṣaaju itusilẹ o jẹ dandan lati ṣe ifilọlẹ aworan ni iyara lati ọdọ alabaṣepọ tuntun, ni ibamu si ọna kika tuntun. Lẹhinna a le ṣafikun ibaramu maapu tuntun bi datafix olowo poku. Iyẹn ni, apẹẹrẹ igbesi aye.

A ṣe, ṣẹda awọn idanwo. Awọn iṣẹ.

Emi kii yoo pese koodu naa: ọpọlọpọ awọn orisun wa, ati pe wọn wa lori GitHub nipasẹ ọna asopọ ni ipari nkan naa. O le fifuye wọn, jiya wọn kọja idanimọ ati iwọn wọn, bi yoo ṣe kan ninu ọran rẹ. Emi yoo fun koodu nikan ti awọn ọna awoṣe meji ti o ṣe iyatọ hydrator, eyiti o yẹ ki o yara, lati hydrator, eyiti o yẹ ki o lọra.

Awọn kannaa jẹ bi atẹle: ọna awoṣe gba awọn orisii ti ipilẹṣẹ nipasẹ awọn ipilẹ kannaa parser. Layer LINQ jẹ parser ati ọgbọn ipilẹ ti hydrator, eyiti o ṣe ibeere si aaye data data ati ṣe afiwe awọn bọtini pẹlu awọn orisii lati parser (fun awọn iṣẹ wọnyi koodu wa laisi LINQ fun lafiwe). Nigbamii ti, awọn orisii naa ti kọja si ọna hydration akọkọ ati awọn iye ti awọn orisii ti ṣeto si awọn ohun-ini ibaramu ti nkan naa.

“Yára” (Ipele Yiyara ni awọn ipilẹ ala):

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

Gẹgẹbi a ti le rii, ikojọpọ aimi pẹlu awọn ohun-ini oluṣeto ni a lo - awọn lambdas ti a ṣajọ ti o pe nkan olupilẹṣẹ. Ti ṣẹda nipasẹ koodu atẹle:

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

Ni gbogbogbo o jẹ kedere. A kọja awọn ohun-ini, ṣẹda awọn aṣoju fun wọn ti o pe awọn oluṣeto, ati fi wọn pamọ. Lẹhinna a pe nigbati o jẹ dandan.

“O lọra” (Ipele ti o lọra ni awọn aami ala):

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

Nibi a lẹsẹkẹsẹ fori awọn ohun-ini ati pe SetValue taara.

Fun mimọ ati bi itọkasi kan, Mo ṣe imuse ọna aiṣedeede ti o kọ awọn iye ti awọn orisii ibatan wọn taara sinu awọn aaye nkan. Apejuwe – Afowoyi.

Bayi jẹ ki a mu BenchmarkDotNet ki o ṣayẹwo iṣẹ naa. Ati lojiji ... (apanirun - eyi kii ṣe abajade to pe, awọn alaye wa ni isalẹ)

Nkan ti ko ni aṣeyọri nipa isare isọtẹlẹ

Kini a ri nibi? Awọn ọna ti o jẹri ijumọ-iṣaaju Yara ti o yọkuro lati lọra ni gbogbo awọn ọna kọja ju awọn ọna pẹlu ìpele Slow lọ. Eyi jẹ otitọ fun pipin mejeeji ati iyara iṣẹ. Ni apa keji, imuse ẹlẹwa ati didara ti aworan agbaye nipa lilo awọn ọna LINQ ti a pinnu fun eyi nibikibi ti o ṣee ṣe, ni ilodi si, dinku iṣelọpọ pupọ. Iyatọ naa jẹ ti aṣẹ. Awọn aṣa ko ni yi pẹlu o yatọ si awọn nọmba ti koja. Iyatọ nikan wa ni iwọn. Pẹlu LINQ o jẹ awọn akoko 4-200 losokepupo, idoti diẹ sii wa ni isunmọ iwọn kanna.

imudojuiwọn

Emi ko gbagbọ oju mi, ṣugbọn diẹ ṣe pataki, ẹlẹgbẹ wa ko gbagbọ boya oju mi ​​tabi koodu mi - Dmitry Tikhonov 0x1000000. Lehin ti o ṣayẹwo ni ilopo meji ojutu mi, o ṣe awari ni iyalẹnu ati tọka aṣiṣe kan ti Mo padanu nitori ọpọlọpọ awọn ayipada ninu imuse, ibẹrẹ si ipari. Lẹhin titunṣe kokoro ti a rii ni iṣeto Moq, gbogbo awọn abajade ṣubu si aaye. Gẹgẹbi awọn abajade idanwo, aṣa akọkọ ko yipada - LINQ tun ni ipa lori iṣẹ diẹ sii ju iṣaro lọ. Sibẹsibẹ, o dara pe iṣẹ naa pẹlu akopọ Ikosile ko ṣe ni asan, ati pe abajade jẹ han mejeeji ni ipin ati akoko ipaniyan. Ifilọlẹ akọkọ, nigbati awọn aaye aimi ti wa ni ipilẹṣẹ, jẹ nipa ti o lọra fun ọna “iyara”, ṣugbọn lẹhinna ipo naa yipada.

Eyi ni abajade idanwo naa:

Nkan ti ko ni aṣeyọri nipa isare isọtẹlẹ

Ipari: nigba lilo iṣaro ni ile-iṣẹ kan, ko si iwulo pataki lati lo si awọn ẹtan - LINQ yoo jẹ iṣelọpọ diẹ sii. Bibẹẹkọ, ni awọn ọna fifuye giga ti o nilo iṣapeye, o le ṣafipamọ iṣaro ni irisi awọn olupilẹṣẹ ati awọn olupilẹṣẹ aṣoju, eyiti yoo pese ọgbọn “yara”. Ni ọna yii o le ṣetọju mejeeji ni irọrun ti iṣaro ati iyara ohun elo naa.

Awọn koodu ala wa nibi. Ẹnikẹni le ṣayẹwo awọn ọrọ mi lẹẹmeji:
Awọn Idanwo HabraReflection

PS: koodu ti o wa ninu awọn idanwo naa nlo IoC, ati ninu awọn aṣepari o nlo itumọ ti o fojuhan. Otitọ ni pe ninu imuse ikẹhin Mo ge gbogbo awọn okunfa ti o le ni ipa iṣẹ ṣiṣe ati jẹ ki abajade ariwo.

PPS: Ṣeun si olumulo Dmitry Tikhonov @ 0x1000000 fun wiwa aṣiṣe mi ni iṣeto Moq, eyiti o kan awọn iwọn akọkọ. Ti eyikeyi ninu awọn onkawe ba ni karma ti o to, jọwọ fẹran rẹ. Ọkunrin naa duro, ọkunrin naa ka, ọkunrin naa ṣayẹwo lẹẹmeji o si tọka aṣiṣe naa. Mo ro pe eyi yẹ fun ọwọ ati aanu.

PPPS: o ṣeun si oluka oye ti o wa si isalẹ ti ara ati apẹrẹ. Emi ni fun uniformity ati wewewe. Awọn diplomacy ti awọn igbejade fi oju Elo lati wa ni fẹ, sugbon mo mu awọn lodi sinu iroyin. Mo beere fun projectile.

orisun: www.habr.com

Fi ọrọìwòye kun