He ʻatikala holomua ʻole e pili ana i ka wikiwiki ʻana i ka noʻonoʻo

E wehewehe koke wau i ke poʻo o ka ʻatikala. ʻO ka hoʻolālā kumu ka hāʻawi ʻana i nā ʻōlelo aʻo maikaʻi a hilinaʻi e pili ana i ka wikiwiki o ka hoʻohana ʻana i ka noʻonoʻo me ka hoʻohana ʻana i kahi hiʻohiʻona maʻalahi akā ʻoiaʻiʻo, akā i ka wā benchmarking ua ʻike ʻia ʻaʻole lohi ka noʻonoʻo e like me kaʻu i manaʻo ai, ʻoi aku ka mālie o LINQ ma mua o kaʻu mau moeʻuhane. Akā i ka hopena, ua hana hewa wau i nā ana ... Aia nā kikoʻī o kēia moʻolelo ola ma lalo o ka ʻoki a ma nā ʻōlelo. No ka mea he mea maʻamau ka laʻana a hoʻokō ʻia ma ke kumumanaʻo e like me ka hana maʻamau i kahi ʻoihana, ua lilo ia i mea hoihoi loa, e like me kaʻu i manaʻo ai, hōʻikeʻike o ke ola: ʻo ka hopena i ka wikiwiki o ke kumuhana nui o ka ʻatikala. ʻAʻole ʻike ʻia ma muli o ka loiloi o waho: Moq, Autofac, EF Core a me nā "bands" ʻē aʻe.

Ua hoʻomaka wau e hana ma lalo o ka manaʻo o kēia ʻatikala: No ke aha e lohi ai ka Reflection

E like me kāu e ʻike ai, ʻōlelo ka mea kākau i ka hoʻohana ʻana i nā ʻelele i hōʻuluʻulu ʻia ma mua o ke kāhea pololei ʻana i nā ʻano ʻano noʻonoʻo e like me ke ala maikaʻi loa e wikiwiki ai i ka noi. Aia nō, ʻoiaʻiʻo, ka hoʻokuʻu ʻana o IL, akā makemake wau e pale aku iā ia, no ka mea ʻo kēia ke ala ikaika loa e hana ai i ka hana, i piha i nā hewa.

Ke noʻonoʻo nei ua paʻa mau wau i kahi manaʻo like e pili ana i ka wikiwiki o ka noʻonoʻo ʻana, ʻaʻole wau i manaʻo nui e nīnau i nā hopena a ka mea kākau.

ʻIke pinepine au i ka hoʻohana naive o ka noʻonoʻo ʻana i ka ʻoihana. Lawe ʻia ke ʻano. Lawe ʻia ka ʻike e pili ana i ka waiwai. Kāhea ʻia ke ʻano SetValue a hauʻoli nā mea a pau. Ua hōʻea ka waiwai i ke kahua pahuhopu, hauʻoli nā mea a pau. Ka poʻe akamai loa - nā poʻe ʻelemakule a me nā alakaʻi hui - e kākau i kā lākou hoʻonui ʻana i ke kūʻē ʻana, e kau ana ma luna o ia ʻano hana naive "universal" mappers o kekahi ʻano i kekahi. ʻO ka mea nui ka mea maʻamau: lawe mākou i nā kahua āpau, lawe i nā waiwai āpau, hoʻololi ma luna o lākou: inā pili nā inoa o nā lālā ʻano, hoʻokō mākou iā SetValue. I kēlā me kēia manawa, hopu mākou i nā ʻokoʻa ma muli o nā hewa kahi i loaʻa ʻole ai kahi waiwai i kekahi o nā ʻano, akā aia ma ʻaneʻi kahi ala e hoʻomaikaʻi ai i ka hana. E ho'āʻo/hopu.

Ua ʻike au i ka poʻe e hana hou i nā parser a me nā palapala palapala me ka lako ʻole ʻia me ka ʻike e pili ana i ka hana ʻana o nā mīkini i hele mai ma mua o lākou. Ua ʻike au i ka poʻe e hūnā i kā lākou hoʻokō naive ma hope o nā hoʻolālā, ma hope o nā pilina, ma hope o nā injections, me he mea lā e kala ʻia kēia i ka bacchanalia ma hope. Huli au i koʻu ihu i kēlā mau ʻike. ʻOiaʻiʻo, ʻaʻole wau i ana i ka leak hana maoli, a, inā hiki, hoʻololi wale wau i ka hoʻokō ʻana i kahi "ʻoi aku ka maikaʻi" inā hiki iaʻu ke kau i koʻu mau lima. No laila, ʻo nā ana mua i kūkākūkā ʻia ma lalo nei ua huikau nui iaʻu.

Manaʻo wau he nui ka poʻe o ʻoukou, e heluhelu ana iā Richter a i ʻole nā ​​​​manaʻo manaʻo ʻē aʻe, ua ʻike i kahi ʻōlelo kūpono loa e pili ana i ka noʻonoʻo ʻana i ke code he mea i loaʻa ka hopena maikaʻi ʻole i ka hana o ka noi.

ʻO ke kāhea ʻana i ka noʻonoʻo e koi i ka CLR e hele i nā hui e ʻimi i ka mea a lākou e pono ai, huki i kā lākou metadata, hoʻopau iā lākou, etc. Eia kekahi, ʻo ka noʻonoʻo ʻana i ka wā e hele ana i nā kaʻina e alakaʻi i ka hoʻokaʻawale ʻana i ka nui o ka hoʻomanaʻo. Ke hoʻohana nei mākou i ka hoʻomanaʻo, wehe ʻo CLR i ka GC a hoʻomaka nā friezes. Pono e lohi, e manaʻoʻiʻo mai iaʻu. ʻO ka nui o ka hoʻomanaʻo ma nā kikowaena hana hou a i ʻole nā ​​mīkini kapuaʻi ʻaʻole e pale i ka lohi kaʻina hana kiʻekiʻe. ʻO ka ʻoiaʻiʻo, ʻoi aku ka nui o ka hoʻomanaʻo ʻana, ʻoi aku ka nui o kou hoʻomaopopo ʻana pehea e hana ai ka GC. ʻO ka noʻonoʻo, ma ke kumumanaʻo, he lole ʻulaʻula hou nona.

Eia nō naʻe, hoʻohana mākou a pau i nā ipu IoC a me nā palapala palapala lā, ke kumu hana o ia mea i hoʻokumu ʻia i ka noʻonoʻo ʻana, akā ʻaʻohe nīnau e pili ana i kā lākou hana. ʻAʻole, ʻaʻole no ka mea pono loa ka hoʻokomo ʻana i nā hilinaʻi a me ka hoʻokaʻawale ʻana mai nā hiʻohiʻona ʻokoʻa o waho e pono ai mākou e kaumaha i ka hana i kēlā me kēia hihia. ʻOi aku ka maʻalahi o nā mea a pau - ʻaʻole pili nui i ka hana.

ʻO ka mea ʻoiaʻiʻo, ʻo nā frameworks maʻamau i hoʻokumu ʻia i ka ʻenehana noʻonoʻo e hoʻohana i nā ʻano hoʻopunipuni āpau e hana pū me ia me ka maikaʻi loa. ʻO ka mea maʻamau he huna huna kēia. ʻO ka maʻamau kēia mau ʻōlelo a me nā ʻelele i hōʻuluʻulu ʻia mai ka lāʻau hōʻike. Mālama ka automapper hoʻokahi i kahi puke wehewehe ʻōlelo hoʻokūkū e pili ana i nā ʻano me nā hana hiki ke hoʻololi i kekahi i kekahi me ke kāhea ʻole ʻana i ka noʻonoʻo.

Pehea e hoʻokō ʻia ai kēia? ʻO ka mea nui, ʻaʻole kēia he ʻokoʻa mai ka loiloi a ka platform ponoʻī e hoʻohana ai e hana i ka code JIT. Ke kāhea ʻia kahi ʻano hana no ka manawa mua, ua hōʻuluʻulu ʻia (a, ʻae, ʻaʻole wikiwiki kēia kaʻina hana); ma nā kelepona aʻe, ua hoʻololi ʻia ka mana i ke ʻano i hōʻuluʻulu ʻia, ʻaʻole e loaʻa nā drawdown hana nui.

I kā mākou hihia, hiki iā ʻoe ke hoʻohana i ka JIT compilation a laila hoʻohana i ke ʻano i hui pū ʻia me ka hana like me kāna mau hoa AOT. E kōkua mai nā ʻōlelo iā mākou i kēia hihia.

Hiki ke hoʻopōkole ʻia ke kumu i nīnau ʻia penei:
Pono ʻoe e hūnā i ka hopena hope o ka noʻonoʻo ʻana ma ke ʻano he ʻelele i loaʻa ka hana i hui ʻia. Maikaʻi nō hoʻi e hūnā i nā mea pono āpau me ka ʻike ʻano ma nā kahua o kāu ʻano, ka mea hana, i mālama ʻia ma waho o nā mea.

Aia i loko o kēia. Hōʻike ka manaʻo maʻamau iā mākou inā hiki ke hōʻuluʻulu ʻia a hūnā ʻia kekahi mea, pono e hana ʻia.

Ke nānā nei i mua, pono e ʻōlelo ʻia ʻo ka cache i ka hana ʻana me ka noʻonoʻo ʻana i kona mau pono, ʻoiai inā ʻaʻole ʻoe e hoʻohana i ke ʻano i manaʻo ʻia e hōʻuluʻulu i nā ʻōlelo. ʻOiaʻiʻo, eia wau e haʻi hou aku nei i nā theses a ka mea kākau o ka ʻatikala aʻu e kuhikuhi nei ma luna.

I kēia manawa e pili ana i ke code. E nānā kākou i kahi laʻana i hoʻokumu ʻia i koʻu ʻeha hou i loaʻa iaʻu ma kahi hana koʻikoʻi o kahi ʻoihana hōʻaiʻē koʻikoʻi. ʻO nā ʻano mea a pau he moʻolelo noʻonoʻo i ʻole e kuhi kekahi.

Aia kekahi kumu. E hoʻokaʻaʻike mai. Aia nā leka me kahi kino maʻamau, kahi e hana ai ka parser a me ka hydrator i kēia mau pilina like. Ua hōʻea mai kahi leka, heluhelu mākou, hoʻokaʻawale iā ia i loko o nā hui waiwai kī, hana i kahi pilina, a mālama i loko o ka waihona.

He kula haʻahaʻa. E ʻōlelo kākou he mau waiwai ka inoa piha, makahiki a me kelepona kelepona. Hoʻouna ʻia kēia ʻikepili ma ka leka. Makemake nō hoʻi ka ʻoihana i ke kākoʻo e hiki ke hoʻohui koke i nā kī hou no ka palapala ʻana i nā waiwai o ka hui i ʻelua i loko o ke kino o ka leka. Ina ua hana kekahi i ka typo i ka la'ana a i 'ole ma mua o ka ho'oku'u 'ia 'ana, pono e ho'omaka koke i ka palapala 'āina mai kahi hoa hou, e ho'ololi i ke 'ano hou. A laila hiki iā mākou ke hoʻohui i kahi hoʻoponopono palapala palapala hou ma ke ʻano he datafix cheap. ʻO ia hoʻi, he laʻana ola.

Hoʻokō mākou, hana i nā hoʻokolohua. Nā hana.

ʻAʻole wau e hāʻawi i ke code: he nui nā kumu, a loaʻa iā lākou ma GitHub ma o ka loulou ma ka hope o ka ʻatikala. Hiki iā ʻoe ke hoʻouka iā lākou, hoʻomāinoino iā lākou ma mua o ka ʻike ʻia a ana iā lākou, e like me ka hopena i kāu hihia. E hāʻawi wale wau i ke code o nā ʻano hoʻohālike ʻelua e hoʻokaʻawale i ka hydrator, i manaʻo ʻia he wikiwiki, mai ka hydrator, i manaʻo ʻia he lohi.

Penei ka manaʻo: loaʻa i ke ʻano hoʻohālikelike nā paʻa i hana ʻia e ka loiloi parser kumu. ʻO ka papa LINQ ka parser a me ka loiloi kumu o ka hydrator, e noi ana i ka pōʻaiapili waihona a hoʻohālikelike i nā kī me nā pālua mai ka parser (no kēia mau hana he code me ka LINQ no ka hoʻohālikelike). A laila, hāʻawi ʻia nā pālua i ke ʻano hydration koʻikoʻi a ua hoʻonohonoho ʻia nā waiwai o nā pālua i nā waiwai kūpono o ka hui.

“Fast” (Prefix Fast in 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;
        }

E like me kā mākou e ʻike ai, hoʻohana ʻia kahi hōʻiliʻili static me nā mea hoʻonohonoho hoʻonohonoho - nā lambdas i hui ʻia e kapa ana i ka mea hoʻonohonoho. Hana ʻia e kēia code:

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

Ma ka laulā he maopopo. Hele mākou i nā waiwai, hana i nā ʻelele no lākou e kāhea aku i nā mea hoʻonohonoho, a mālama iā lākou. A laila kāhea mākou inā pono.

“Slow” (Prefix Slow i nā pae kuhikuhi):

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

Maanei mākou e kāpae koke i nā waiwai a kāhea pololei iā SetValue.

No ka maopopo a ma ke ʻano he kuhikuhi, ua hoʻokō wau i kahi ʻano naive e kākau pololei i nā waiwai o kā lākou correlation pais i loko o nā kahua hui. Prefix – Manual.

I kēia manawa, e lawe kākou iā BenchmarkDotNet a nānā i ka hana. A ʻaʻole koke ... (spoiler - ʻaʻole kēia ka hopena pololei, aia nā kikoʻī ma lalo)

He ʻatikala holomua ʻole e pili ana i ka wikiwiki ʻana i ka noʻonoʻo

He aha kā mākou e ʻike nei ma ʻaneʻi? ʻOi aku ka lohi o nā ala lanakila i ka prefix Fast ma kahi o nā ala āpau ma mua o nā ʻano me ka prefix Slow. He ʻoiaʻiʻo kēia no ka hoʻokaʻawale ʻana a me ka wikiwiki o ka hana. Ma ka ʻaoʻao ʻē aʻe, ʻo ka hoʻokō nani a nani hoʻi o ka palapala ʻāina me ka hoʻohana ʻana i nā ʻano LINQ i manaʻo ʻia no kēia inā hiki, ma kahi ʻē aʻe, e hōʻemi nui i ka huahana. ʻO ka ʻokoʻa o ka hoʻonohonoho. ʻAʻole loli ke ʻano me nā helu like ʻole o nā pā. ʻO ka ʻokoʻa wale nō ma ka pālākiō. Me ka LINQ he 4 - 200 mau manawa ʻoi aku ka lohi, ʻoi aku ka nui o nā ʻōpala ma kahi like like.

Kiʻi hou i nā

ʻAʻole wau i manaʻoʻiʻo i koʻu mau maka, akā ʻo ka mea nui, ʻaʻole i manaʻoʻiʻo kā mākou hoa hana i koʻu mau maka a i koʻu code - ʻO Dmitry Tikhonov 0x1000000. Ma hope o ka nānā ʻana i kaʻu hopena, ua ʻike maikaʻi ʻo ia a kuhikuhi i kahi hewa i hala iaʻu ma muli o ka nui o nā loli i ka hoʻokō ʻana, mai ka mua a i ka hope. Ma hope o ka hoʻoponopono ʻana i ka pahu i loaʻa i ka hoʻonohonoho Moq, ua hāʻule nā ​​​​hopena a pau. Wahi a nā hopena hoʻāʻo hou, ʻaʻole e loli ke ʻano nui - pili mau ka LINQ i ka hana ma mua o ka noʻonoʻo ʻana. Eia nō naʻe, maikaʻi ka hana ʻole ʻana o ka hana me Expression compilation, a ʻike ʻia ka hopena i ka hoʻokaʻawale ʻana a me ka manawa hoʻokō. ʻO ka hoʻomaka mua, i ka wā e hoʻomaka ai nā māla static, ʻoi aku ka lohi no ke ʻano "wikiwiki", akā hoʻololi ke kūlana.

Eia ka hopena o ka hoʻāʻo hou ʻana:

He ʻatikala holomua ʻole e pili ana i ka wikiwiki ʻana i ka noʻonoʻo

Ka hopena: i ka wā e hoʻohana ai i ka noʻonoʻo ʻana i kahi ʻoihana, ʻaʻohe pono e hoʻohana i nā hoʻopunipuni - e ʻai nui ʻo LINQ i ka huahana. Eia nō naʻe, i nā ʻano hana kiʻekiʻe e koi ai i ka hoʻonui ʻana, hiki iā ʻoe ke mālama i ka noʻonoʻo ʻana ma ke ʻano o nā mea hoʻomaka a me nā mea hōʻuluʻulu ʻelele, a laila e hāʻawi i ka loiloi "wikiwiki". Ma kēia ala hiki iā ʻoe ke mālama i ka maʻalahi o ka noʻonoʻo a me ka wikiwiki o ka noi.

Loaʻa ka code benchmark maanei. Hiki i kekahi ke nānā pālua i kaʻu mau ʻōlelo:
HabraReflectionTests

PS: hoʻohana ka code i nā hoʻāʻo iā IoC, a ma nā papa kuhikuhi e hoʻohana ana i kahi kūkulu kikoʻī. ʻO ka ʻoiaʻiʻo ma ka hoʻokō hope loa e ʻoki au i nā mea āpau e hiki ke hoʻopilikia i ka hana a hoʻomake i ka hopena.

PPS: Mahalo i ka mea hoʻohana Dmitry Tikhonov @0x1000000 no ka ʻike ʻana i kaʻu hewa i ka hoʻonohonoho ʻana iā Moq, ka mea i pili i nā ana mua. Inā lawa ka karma i kekahi o ka poʻe heluhelu, e ʻoluʻolu e makemake. Kū ke kanaka, heluhelu ke kanaka, nānā pālua ke kanaka a kuhikuhi i ka hewa. Manaʻo wau he kūpono kēia i ka mahalo a me ke aloha.

PPPS: mahalo i ka mea heluhelu akamai i hiki i lalo o ke ʻano a me ka hoʻolālā. ʻO wau no ka lokahi a me ka maʻalahi. ʻO ka diplomacy o ka hōʻike e waiho nui i ka makemake, akā ua noʻonoʻo wau i ka hoʻohewa ʻana. Nīnau au i ka projectile.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka