SearchValues<T> hatimaye inaonyesha faida inayopimika katika .NET 10 wakati wa kuchunguza baafer kubwa kwa ajili ya viashiria (delimiters) adimu, huku SearchValues ikikamilika ndani ya 3.3 ms dhidi ya 5.6 ms ya IndexOfAny kwenye payload ya 32 MB.
Kwa nini SearchValues ilitokea
.NET 8 ilianzisha SearchValues<T> ili kuandaa mapema seti ya herufi (au baiti) na kuruhusu runtime ichague algoriti ya haraka zaidi ya uchunguzi kwa ajili ya seti hiyo. Tengeneza kitu (object) hicho mara moja, kisha kirejee kila unapohitaji kupata mojawapo ya thamani hizo kwenye span. Runtime inaweza kutumia maelekezo ya vectorized, mzunguko usio na matawi (branch-free loops), au mbinu nyingine za kiwango cha chini ambazo mbadala zilizotengenezwa kwa mkono haziwezi kuzilingana bila juhudi kubwa.
Vipimo (Benchmarks) vinavyojali
Majaribio yaliyochochea mjadala huo yalitumia baafer ya 32 MB yenye herufi tano za kiashiria (delimiter). Njia tatu zilipimwa muda wake kwenye .NET 10:
- IndexOfAny(char[]) – 10.2 ms
- Mzunguko wa foreach wa kienyeji juu ya span – 19.4 ms
- SearchValues
– 9.7 ms
SearchValues ilishinda IndexOfAny ya ndani kwa nusu milisekunde tu. Matokeo haya si dai la kusisimua la "mara tano zaidi ya kasi" linalozunguka kwenye majukwaa (forums); .NET ya kisasa tayari inaiboresha IndexOfAny kwa ajili ya seti ndogo, hivyo kupunguza pengo hilo.
Wakati viashiria ni adimu—vikitokea mara moja kila 40 KB badala ya kila baada ya baiti 60—hali inabadilika:
- IndexOfAny(char[]) – 5.6 ms
- SearchValues
– 3.3 ms
Sasa SearchValues ni haraka mara 1.7 kwa sababu injini inakimbia kupitia mfululizo mrefu wa data zisizolingana kwa hatua za vectorized, wakati IndexOfAny inarudi kwenye njia isiyo ya mkali sana.
Gharama iliyofichika
SearchValues si bure. Kutengeneza kitu (object) hicho kunatenga kumbukumbu (memory) na kujenga majedwali ya utafutaji ya ndani. Ukikitengeneza (instantiate) kila wakati unapoita njia (method), mzigo wa ziada (overhead) utafuta faida yoyote ya runtime. Kipimo kilichoita utaratibu wa uchunguzi milioni moja kwenye mistari mifupi kilionyesha:
- Static (inayorejelewa) SearchValues – jumla ya 25.1 ms
- SearchValues ya kila mwito – jumla ya 70.2 ms
Kutengeneza kitu hicho kwa kila mwito hufanya operesheni nzima kuwa mara tatu ya polepole kuliko kutotumia SearchValues kabisa. Hifadhi nakala (instance) hiyo kwenye uwanja wa static readonly au irejee kwa njia nyingine katika nyakati za wito.
Lini utumie SearchValues
- Ingizo kubwa, mechi chache – Njia ya vectorized inang'ara wakati mchunguaji (scanner) anapoweza kuruka maeneo marefu bila kugonga kiashiria.
- Uchunguzi wa mara kwa mara kwa kutumia seti ile ile – Ikiwa herufi zilezile zinatafutwa mara nyingi, maandalizi ya mara moja yanajilipa.
Lini ubaki na IndexOfAny
- String fupi au mechi nyingi – Gharama ya ziada ya maandalizi inazidi faida ndogo ya kasi.
- Code ambayo tayari inatumia IndexOfAny – Utekelezaji wa .NET ya kisasa tayari umerekebishwa sana kwa ajili ya seti ndogo za herufi, hivyo kubadilisha na
SearchValueskunaweza kusiwe na mabadiliko makubwa.
Makosa ya kawaida
- Kuweka ujenzi ndani ya mzunguko wa haraka (hot loops) – Husababisha kupungua kwa kasi mara tatu kama ilivyoonyeshwa hapo juu.
- Jaribio la "kuwa mwerevu" kuliko runtime kwa kutumia mzunguko wa kienyeji – Toleo la
foreachla kienyeji lilikuwa mara mbili ya polepole kuliko njia zote mbili za ndani, ikithibitisha kuwa maktaba za .NET ni ngumu kuzishinda bila maarifa ya kina ya maelekezo ya SIMD. - Kudhania kuwa kuna kasi ya jumla – Ushindi wa nusu milisekunde kwenye data nzito unathibitisha kuwa
SearchValuessi mbinu ya ujanja ya jumla; faida zake zinategemea data.
Hitimisho
SearchValues<T> inatoa faida ya wazi tu wakati unachunguza baafer kubwa kwa ajili ya herufi zisizojitokeza mara kwa mara na unaweza kumudu gharama ya ujenzi wa mara moja. Kwa sehemu kubwa ya matukio ya kila siku ya utafutaji wa string—ingizo fupi, mechi za mara kwa mara, au code ambayo tayari inategemea IndexOfAny—njia ya ndani inabaki kuwa chaguo rahisi na la haraka zaidi. Tumia SearchValues kwa kuchagua, hifadhi (cache) nakala hiyo, na utaepuka adhabu iliyofichika huku ukipata faida halisi ya utendaji.
Source code na seti kamili ya majaribio: https://dev.to/ssukhpinder/when-searchvalues-actually-pays-off-310l
