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:
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 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 -
Eia ka hopena o ka hoʻāʻo hou ʻana:
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:
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
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