Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Aké sú dôsledky výkonu používania push vs concat vo veľkých poliach


Aké sú dôsledky výkonu používania push vs concat vo veľkých poliach


Dôsledky výkonu použitia push verzus CONCAT vo veľkých poliach vznikajú predovšetkým z rôznych spôsobov, ako tieto metódy zvládajú zlúčenie alebo pridanie prvkov, ako aj ich základné riadenie pamäte a výpočtové režijné náklady.

Pri použití Array.Push sa prvky z jedného poľa pripoja priamo k existujúcemu poľu. Na zlúčenie polí to často zahŕňa vzorec, ako je napríklad použitie použitia alebo operátora šírenia na stlačenie viacerých prvkov naraz, napríklad Array.prototype.push.apply (ARR1, ARR2). Tento prístup modifikuje pôvodné pole na mieste a všeobecne sa vykonáva v lineárnom čase, O (n), kde n je počet tlačených prvkov. Dôvodom je to, že Push zvyčajne pripojí prvky na koniec existujúceho poľa bez vytvorenia nového poľa alebo opakovane kopírovanie celého obsahu. Vzhľadom na túto mutáciu na mieste je minimalizovaná režijná pamäť a metóda často využíva optimalizované susedné pamäťové bloky a lokalitu vyrovnávacej pamäte, čím sa znižuje náklady na prístup k pamäti.

Naopak, Array.concat nemení pôvodné polia. Namiesto toho vytvára nové pole, ktoré obsahuje prvky pôvodných polí zreteľných dohromady. Vytvorenie tohto nového poľa zahŕňa pridelenie pamäte pre kombinovanú veľkosť polí a kopírovanie prvkov z oboch zdrojových polí do tohto novo prideleného priestoru. Toto kopírovanie zavádza režijné náklady, ktoré je vo všeobecnosti úmerné veľkosti oboch polí, čím sa časová zložitosť operácie o (M + n), kde M a N sú zreťazené veľkosti polí. Vytvorenie nového poľa a kopírovacie údaje vedie k zvýšeniu využitia pamäte a vyššej pravdepodobnosti spustenia zberu odpadu, najmä pri veľmi veľkých poliach.

Referenčné testy dôsledne ukazujú, že Push môže byť výrazne rýchlejší ako Concat pre operácie zahŕňajúce zlúčenie alebo pridávanie veľkého počtu prvkov. Napríklad jedna referenčná hodnota preukázala, že na opakovanom zlúčení polí s tisíckami prvkov bol Push zhruba 945 -krát rýchlejší ako Concat v chróme a dokonca rýchlejšie vo Firefoxe. Tento obrovský rozdiel pochádza z správania Concat pri vytváraní nového poľa a opakovane kopírovanie údajov, zatiaľ čo Push rastie existujúce pole postupnejšie a na mieste, čím sa vyhýba opakovaným prerozdeleniam pamäte.

Tieto výkonnostné charakteristiky sa však môžu líšiť v závislosti od scenárov použitia. Ak je cieľom jedinou zreťazením dvoch veľmi veľkých vopred pridelených polí, Concat by mohol fungovať pomerne dobre, pretože sa pridelí raz a kópiu vykoná raz. V takýchto prípadoch by prístup k pripojeniu jedného po druhom alebo v dávke mohol spôsobiť viac prerozdelenia alebo kopírovanie interne, čo by mohlo znížiť jeho teoretickú výhodu. Avšak pri opakovanom zlúčení alebo pridávaní mnohých prvkov do mnohých polí sa push má tendenciu amortizovať o (1) na pridanie, pretože polia často prideľujú pamäť geometricky (zdvojnásobenie kapacity pri prekročení), čo je celkovo vysoko efektívne.

Z hľadiska pamäte znamená Mutácia spoločnosti Push na mieste menej časté alokácie a potenciálne menšie napätie na pamäťovom subsystéme. Metóda CONCAT, ktorá vyžaduje nové alokácie a kopíruje údaje na znova, napätie pamäť a vyrovnávacie pamäte viac, najmä pre veľké polia. Táto situácia má za následok, že operácie CONCAT pravdepodobne presahujú limity CPU vyrovnávacej pamäte, čo vedie k pomalším časom prístupu pamäte v dôsledku opakovaného načítania údajov z vyrovnávacích pamätí s vyššou latenciou alebo hlavnej pamäte. Push, vyhnúť sa revíziám na údaje, ktoré už sú v poli, môže lepšie využiť lokalitu vyrovnávacej pamäte.

Malo by sa poznamenať, že Push mení pôvodné pole, zatiaľ čo Concat zachováva nemennosť vrátením nového poľa. Tento rozdiel je dôležitý pri návrhu aplikácií, ale má vplyv aj na výkon. Nemenné zreťazenia s Concat nezaručujú žiadne vedľajšie účinky, ale platia cenu extra pamäte a kopírovanie, zatiaľ čo tlačenie obchoduje s nemeniteľnosťou za rýchlosť tým, že priamo upravuje zdrojové pole.

Niektoré nuansy zahŕňajú, že motory JavaScript môžu tieto operácie optimalizovať odlišne na základe kontextu a zložitosti. Napríklad motory optimalizujú pevné typy alebo malé polia agresívnejšie. Podpis Concat's Method tiež podporuje pripojenie viacerých polí a hodnôt súčasne (preťažené podpisy), čo si vyžaduje vnútorné sploštenie a kopírovacie kroky, ktoré sa pridávajú nad hlavou, zatiaľ čo tlačenie priame pridáva prvky bez takéhoto sploštenia.

Pokiaľ ide o zber odpadu, časté alokácie zapojené do Concat môžu zvýšiť pracovné zaťaženie zberu odpadu, pretože staré polia sa po kopírovaní vyradia. To môže viesť k prestávkam alebo k poklesom výkonu v scenároch s vysokou alokáciou. Rastúca existujúca pole Push znižuje frekvenciu prideľovania, a teda režijné zbery odpadu.

Celkovo si výber medzi push a Concat zahŕňa kompromis medzi rýchlosťou (push) a nemeniteľnosťou/pohodlím (CONCAT). Pre operácie na veľkých poliach s výkonom ako prioritou je Push vo všeobecnosti preferovanou metódou vďaka svojej efektívnejšej manipulácii s pamäťou a nižšou réžou. Concatova režijná náklady z tvorby a kopírovania poľa sa so zvyšovaním veľkostí polí stáva veľmi nákladným. V scenároch, kde je nemeniteľnosť kritická, sa Concat používa napriek trestu výkonu.

Stručne povedané, Push zvyčajne vykazuje lepší výkon a nižšiu režijnú pamäť v porovnaní s CONCAT v kontexte veľkých polí v dôsledku modifikácie na mieste, amortizované pripojenia konštantného času a znížené kopírovanie. Concat trpí dodatočnými prideľovaním pamäte a nákladmi na kopírovanie, pretože vytvára nové pole zakaždým, keď sa volá, čo ovplyvňuje čas na vykonanie času aj využitie pamäte, najmä pri veľmi veľkých poliach. Tieto rozdiely sa zväčšujú pri zlúčení mnohých polí alebo pri riešení masívnych súborov údajov, kde môže byť Push stovky až tisíckrát rýchlejšie ako Concat podľa referenčných hodnôt. V závislosti od kontextu používania a optimalizácie motora však tieto všeobecné vzorce môžu mať výnimky a mali by sa zvážiť spolu s potrebou nemenosti a udržiavateľnosti kódu.