Labari mara nasara game da hanzarin tunani

Nan da nan zan bayyana taken labarin. Shirin na asali shine ya ba da shawara mai kyau, abin dogaro kan yadda za a hanzarta yin amfani da tunani ta hanyar amfani da misali mai sauƙi amma na gaske, amma a lokacin ƙididdigewa ya nuna cewa tunani ba ya jinkiri kamar yadda na yi tunani, LINQ yana da hankali fiye da a cikin mafarki na. Amma a ƙarshe ya zama cewa ni ma na yi kuskure a cikin ma'auni ... Cikakken bayanin wannan tarihin rayuwa yana cikin yanke kuma a cikin sharhi. Tun da misalin ya zama ruwan dare gama gari kuma ana aiwatar da shi bisa ƙa'ida kamar yadda aka saba yi a cikin kasuwanci, ya zama abin ban sha'awa sosai, kamar yadda nake gani, nunin rayuwa: tasirin saurin babban batun labarin ya kasance. ba a sani ba saboda ma'anar waje: Moq, Autofac, EF Core da sauransu "bandings".

Na fara aiki a ƙarƙashin tasirin wannan labarin: Me yasa Tunani yana jinkirin

Kamar yadda kake gani, marubucin ya ba da shawarar yin amfani da wakilai da aka haɗa maimakon kiran nau'in tunani kai tsaye a matsayin babbar hanya don hanzarta aikace-aikacen. Akwai, ba shakka, IL watsi, amma ina so in guje wa shi, tun da wannan ita ce hanya mafi yawan aiki don aiwatar da aikin, wanda ke cike da kurakurai.

Ganin cewa koyaushe ina riƙe irin wannan ra'ayi game da saurin tunani, ban yi niyya ba musamman don tambayar ƙarshen marubucin.

Sau da yawa nakan gamu da rashin amfani da tunani a cikin kasuwancin. Ana ɗaukar nau'in. Ana ɗaukar bayanai game da kadarorin. Ana kiran hanyar SetValue kuma kowa yana murna. Darajar ta isa filin da aka yi niyya, kowa yana farin ciki. Mutane masu wayo sosai - manya da masu jagoranci - suna rubuta abubuwan haɓakawa don ƙi, suna dogara da irin wannan aiwatar da taswirar "duniya" na nau'in nau'in zuwa wani. Mahimmancin shine yawanci wannan: muna ɗaukar dukkan filayen, ɗaukar duk kaddarorin, mu sake maimaita su: idan sunayen membobin nau'in sun dace, muna aiwatar da SetValue. Daga lokaci zuwa lokaci muna kama keɓantacce saboda kurakurai inda ba mu sami wasu kadarori ba a cikin ɗayan nau'ikan, amma ko a nan akwai hanyar fita da ke inganta aiki. Gwada/kama.

Na ga mutane sun sake ƙirƙira na'urori da taswira ba tare da cikakken makamai ba game da yadda injinan da suka zo gabansu ke aiki. Na ga mutane suna ɓoye ayyukansu na butulci a bayan dabarun, a bayan musaya, a bayan allura, kamar dai wannan zai ba da uzuri na baya-bayan nan. Na juya hancina a irin wannan fahimtar. A gaskiya ma, ban auna ƙwanƙwasa na ainihi ba, kuma, idan zai yiwu, kawai na canza aiwatarwa zuwa mafi "mafi kyau" idan zan iya samun hannuna a kai. Saboda haka, ma'auni na farko da aka tattauna a ƙasa sun ruɗe ni sosai.

Ina tsammanin da yawa daga cikinku, masu karanta Richter ko wasu masana akida, sun ci karo da cikakkiyar magana mai gaskiya cewa tunani a cikin lambobi wani lamari ne da ke da mummunan tasiri ga aikin aikace-aikacen.

Kiran tunani yana tilasta CLR su bi ta cikin majalisai don nemo wanda suke buƙata, cire metadata, tantance su, da sauransu. Bugu da ƙari, yin tunani yayin da ke biye da layi yana haifar da rarraba babban adadin ƙwaƙwalwar ajiya. Muna amfani da ƙwaƙwalwar ajiya, CLR yana buɗe GC kuma an fara friezes. Ya kamata ya zama a hankali a hankali, yi imani da ni. Yawancin ƙwaƙwalwar ajiya akan sabobin samarwa na zamani ko na'urorin girgije ba su hana babban jinkirin aiki ba. A zahiri, yawan ƙwaƙwalwar ajiya, da yuwuwar za ku SANAR da yadda GC ke aiki. Tunani shine, a ka'idar, ƙarin jan tsumma a gare shi.

Koyaya, dukkanmu muna amfani da kwantena na IoC da taswirar kwanan wata, tsarin aikin wanda shima ya dogara akan tunani, amma yawanci babu tambayoyi game da aikinsu. A'a, ba saboda gabatarwar abubuwan dogaro da ƙayyadaddun ƙayyadaddun ƙayyadaddun mahallin mahallin waje suna da mahimmanci don haka dole ne mu sadaukar da aiki a kowane hali. Komai ya fi sauƙi - da gaske baya shafar aiki sosai.

Gaskiyar ita ce mafi yawan ginshiƙai waɗanda suka dogara da fasahar tunani suna amfani da kowane nau'i na dabaru don yin aiki tare da shi mafi kyau. Yawancin lokaci wannan cache ne. Yawanci waɗannan maganganu ne da wakilai da aka haɗa daga itacen magana. Mai sarrafa atomatik iri ɗaya yana kula da ƙamus ɗin gasa wanda ya dace da nau'ikan tare da ayyuka waɗanda zasu iya juyar da ɗayan zuwa wani ba tare da kiran tunani ba.

Ta yaya ake samun wannan? Ainihin, wannan bai bambanta da dabaru da dandamali da kansa ke amfani da shi don samar da lambar JIT ba. Lokacin da aka kira wata hanya a karon farko, ana haɗa ta (kuma, eh, wannan tsari ba shi da sauri); a kan kira na gaba, ana canja wurin sarrafawa zuwa hanyar da aka riga aka tsara, kuma ba za a sami raguwar aiki mai mahimmanci ba.

A cikin yanayinmu, zaku iya amfani da tarin JIT sannan ku yi amfani da halayen da aka haɗa tare da aiki iri ɗaya da takwarorinsa na AOT. Maganganu za su taimaka mana a wannan yanayin.

Za a iya tsara ƙa'idar da ake tambaya a taƙaice kamar haka:
Ya kamata ku adana sakamakon ƙarshe na tunani a matsayin wakili mai haɗar aikin. Hakanan yana da ma'ana don adana duk abubuwan da ake buƙata tare da nau'in bayanai a cikin nau'ikan nau'ikan ku, ma'aikaci, waɗanda aka adana a wajen abubuwan.

Akwai tunani a cikin wannan. Hankali ya nuna mana cewa idan za a iya harhada wani abu a cache, to a yi shi.

Neman gaba, ya kamata a ce cache a cikin aiki tare da tunani yana da fa'ida, koda kuwa ba ku yi amfani da hanyar da aka tsara na tattara maganganun ba. A gaskiya, a nan kawai ina maimaita abubuwan da marubucin labarin da nake magana a sama.

Yanzu game da code. Bari mu kalli wani misali wanda ya dogara ne akan ciwona na baya-bayan nan da na fuskanta a cikin wani gagarumin samarwa na wata babbar cibiyar bashi. Duk mahaɗan ƙage ne don kada wani ya yi zato.

Akwai jigon. Bari a sami Contact. Akwai haruffa tare da daidaitaccen jiki, daga abin da parser da hydrator ke ƙirƙirar waɗannan lambobin sadarwa iri ɗaya. Wasiƙa ta zo, mun karanta ta, muka rarraba ta zuwa nau'i-nau'i masu ƙima, ƙirƙira lambar sadarwa, muka ajiye ta a cikin ma'ajin bayanai.

Elementary ne. Bari mu ce lamba tana da cikakken suna, Shekaru da Wayar Tuntuɓi. Ana watsa wannan bayanan a cikin wasika. Har ila yau, kasuwancin yana son tallafi don samun damar ƙara sabbin maɓalli da sauri don yin taswirar mahalli zuwa nau'i-nau'i a jikin harafin. Idan wani ya yi typo a cikin samfuri ko kuma kafin a fitar da shi ya zama dole a hanzarta ƙaddamar da taswira daga sabon abokin tarayya, wanda ya dace da sabon tsari. Sannan za mu iya ƙara sabon haɗin taswira azaman arha datafix. Wato misalin rayuwa.

Muna aiwatarwa, ƙirƙirar gwaje-gwaje. Ayyuka.

Ba zan ba da lambar ba: akwai tushe da yawa, kuma ana samun su akan GitHub ta hanyar haɗin gwiwa a ƙarshen labarin. Kuna iya loda su, azabtar da su fiye da ganewa kuma ku auna su, kamar yadda zai shafi ku. Zan ba da lambar hanyoyin samfuri guda biyu kawai waɗanda ke bambance hydrator, wanda ya kamata ya zama mai sauri, daga na'urar hydrator, wanda yakamata ya kasance a hankali.

Hankali shine kamar haka: hanyar samfuri tana karɓar nau'i-nau'i da aka ƙirƙira ta ainihin ma'anar fassarori. Layin LINQ shine parser da ainihin ma'ana na hydrator, wanda ke yin buƙatu zuwa mahallin bayanai kuma yana kwatanta maɓalli tare da nau'i-nau'i daga parser (don waɗannan ayyuka akwai lambar ba tare da LINQ don kwatanta ba). Na gaba, ana wuce nau'i-nau'i zuwa babban hanyar hydration kuma an saita ƙimar nau'i-nau'i zuwa abubuwan da suka dace na mahallin.

"Mai sauri" (Mai sauri Prefix a cikin alamomi):

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

Kamar yadda muke iya gani, ana amfani da tarin a tsaye tare da kaddarorin saiti - harhada lambdas waɗanda ke kiran mahallin saiti. An ƙirƙira ta lambar mai zuwa:

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

Gabaɗaya ya bayyana. Muna ratsa kaddarorin, muna ƙirƙira musu wakilai waɗanda ke kiran masu saiti, kuma muna adana su. Sai mu kira idan ya cancanta.

"Slow" (Prefix Slow in benchmarks):

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

Anan muna ketare kaddarorin nan da nan kuma mu kira SetValue kai tsaye.

Don tsabta da kuma a matsayin tunani, na aiwatar da hanyar da ba ta dace ba wacce ke rubuta ƙimar alaƙar nau'ikan su kai tsaye cikin filayen mahalli. Prefix - Manual.

Yanzu bari mu ɗauki BenchmarkDotNet kuma mu bincika aikin. Kuma ba zato ba tsammani ... (mai lalata - wannan ba daidai ba ne sakamakon, cikakkun bayanai suna ƙasa)

Labari mara nasara game da hanzarin tunani

Me muke gani a nan? Hanyoyin da ke ɗauke da babban fa'ida mai sauri suna zama a hankali a kusan duk hanyoyin wucewa fiye da hanyoyin tare da Slow prefix. Wannan gaskiya ne ga duka rarrabawa da saurin aiki. A gefe guda, kyakkyawan aiwatar da taswirar taswira ta amfani da hanyoyin LINQ da aka yi niyya don wannan a duk inda zai yiwu, akasin haka, yana rage yawan aiki. Bambanci shine tsari. Yanayin baya canzawa tare da lambobi daban-daban na wucewa. Bambancin kawai shine a cikin ma'auni. Tare da LINQ yana sau 4 - 200 a hankali, akwai ƙarin datti akan ma'auni ɗaya.

updated

Ban yarda da idanu na ba, amma mafi mahimmanci, abokin aikinmu bai yarda da idona ko lambara ba - Dmitry Tikhonov 0x1000000. Bayan ya duba bayani na sau biyu, ya gano da kyau kuma ya nuna kuskuren da na rasa saboda yawancin canje-canje a cikin aiwatarwa, daga farko zuwa ƙarshe. Bayan gyara kwaro da aka samo a cikin saitin Moq, duk sakamakon ya faɗi cikin wurin. Dangane da sakamakon sake gwadawa, babban yanayin ba ya canzawa - LINQ har yanzu yana rinjayar aiki fiye da tunani. Duk da haka, yana da kyau cewa aikin tare da ƙaddamarwar Magana ba a yi shi a banza ba, kuma sakamakon yana bayyane a cikin rabo da lokacin aiwatarwa. Ƙaddamarwar farko, lokacin da aka ƙaddamar da filayen tsaye, a dabi'ance yana da hankali don hanyar "sauri", amma sai yanayin ya canza.

Ga sakamakon sake gwadawa:

Labari mara nasara game da hanzarin tunani

Kammalawa: lokacin amfani da tunani a cikin kamfani, babu buƙatar takamaiman amfani da dabaru - LINQ zai ƙara cinye yawan aiki. Koyaya, a cikin hanyoyin da ake ɗaukar nauyi waɗanda ke buƙatar haɓakawa, zaku iya adana tunani a cikin nau'ikan masu farawa da masu tara wakilai, waɗanda zasu samar da dabaru na "sauri". Ta wannan hanyar za ku iya kula da sassaucin tunani da saurin aikace-aikacen.

Ana samun lambar benchmark anan. Kowa na iya duba kalmomi na sau biyu:
Gwajin HabraReflection

PS: lambar da ke cikin gwaje-gwajen tana amfani da IoC, kuma a cikin alamomin tana amfani da ƙayyadaddun gini. Gaskiyar ita ce, a cikin aiwatarwa na ƙarshe na yanke duk abubuwan da za su iya rinjayar aikin da kuma sanya sakamakon amo.

PPS: Godiya ga mai amfani Dmitry Tikhonov @0x1000000 don gano kuskurena na kafa Moq, wanda ya shafi ma'aunin farko. Idan daya daga cikin masu karatu yana da isasshen karma, da fatan za a so. Mutumin ya tsaya, mutumin ya karanta, mutumin ya duba sau biyu yana nuna kuskuren. Ina ganin wannan ya cancanci girmamawa da tausayawa.

PPPS: godiya ga ƙwararren mai karatu wanda ya kai ga ƙasan salo da ƙira. Ni ne don daidaituwa da dacewa. Diflomasiyyar gabatarwar ta bar abin da ake so, amma na yi la'akari da sukar. Ina neman majigi.

source: www.habr.com

Add a comment