Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Millised on jõudluse tagajärjed push vs concat kasutamisel suurtes massiivides


Millised on jõudluse tagajärjed push vs concat kasutamisel suurtes massiivides


Push -versus CONCAT -i kasutamise mõju suurtes massiivis tuleneb peamiselt erinevatest viisidest, kuidas need meetodid käsitlevad massiivi ühinemist või elementide lisamist, samuti nende aluseks olevat mäluhaldust ja arvutuslikku üldkulu.

Array.push kasutamisel lisatakse ühe massiivi elemendid otse olemasolevale massiivile. Massiivide liitmiseks hõlmab see sageli sellist mustrit nagu rakenduse kasutamine või levikuoperaator, et suruda mitu elementi korraga, näiteks Array.prototype.push.apply (ARR1, ARR2). See lähenemisviis muudab algset massiivi paigas ja toimib üldiselt lineaarse aja jooksul O (n), kus n on lükatud elementide arv. Põhjus on see, et Push lisab olemasoleva massiivi lõppu tavaliselt elemente, luues uut massiivi ega kopeeriks kogu sisu korduvalt. Selle kohase mutatsiooni tõttu on mälu üldkulud minimeeritud ja meetod kasutab sageli optimeeritud külgnevaid mäluplokke ja vahemälu paiknemist, vähendades mälu juurdepääsu kulusid.

Seevastu Array.concat ei muuda algmassiive. Selle asemel loob see uue massiivi, mis sisaldab ühendatud originaalsete massiivide elemente. Selle uue massiivi loomine hõlmab mälu eraldamist massiivide suurusele ja mõlemast lähtemassiivist kopeerimist sellesse äsja eraldatud ruumi. See kopeerimine tutvustab üldkulusid, mis on üldiselt proportsionaalsed mõlema massiivi suurusega, muutes operatsiooni aja keerukuse O (M + N), kus M ja N on massiivide ühendamise suurused. Uue massiivi ja andmete kopeerimise loomine põhjustab suurenenud mälu kasutamist ja suuremat tõenäosust prügikogumise käivitamiseks, eriti väga suurte massiividega.

Võrdluskatsed näitavad järjekindlalt, et tõuke võib olla märkimisväärselt kiirem kui CONCAT operatsioonide puhul, mis hõlmavad suure hulga elemente ühendamist või lisamist. Näiteks näitas üks võrdlusalus, et massiivide korduvalt tuhandete elementidega ühendamisel oli tõuke umbes 945 korda kiirem kui CONCAT Chrome'is ja Firefoxis veelgi kiirem. See suur erinevus tuleneb Concat'i käitumisest uue massiivi loomise ja korduvalt kopeerimise kohta, samas kui Push kasvatab olemasolevat massiivi järk -järgult ja paigas, vältides korduvat mälu ümberpaigutamist.

Need jõudluse omadused võivad aga sõltuvalt kasutusstsenaariumidest erineda. Kui eesmärk on kahe väga suure eraldatud massiivi ühekordseks ühenduseks, võib CONCAT suhteliselt hästi toimida, kuna see eraldab üks kord ja teeb koopia üks kord. Sellistel juhtudel võib Push's üks-ühe või partii lisa lähenemisviis põhjustada mitut ümberpaigutamist või sisemiselt kopeerimist, mis võib vähendada selle teoreetilist eelist. Sellegipoolest kipub paljude massiivide jaoks paljude elementide liitmiseks või lisamiseks amortiseeruma O (1) lisamise kohta, kuna massiivid eraldavad mälu sageli geomeetriliselt (kahekordistusvõime ületamisel), muutes selle üldiselt üldarvestuseks.

Mälu vaatenurgast tähendab Push-i kohapealne mutatsioon harvemini jaotusi ja potentsiaalselt vähem pinget mälu alamsüsteemile. CONCAT -meetod, mis nõuab uusi jaotusi ja koopiaid uuesti üle, rõhutab mälu ja vahemälu, eriti suurte massiivide puhul. Selle olukorra tulemuseks on CONCAT-operatsioonid, mis võivad ületada CPU vahemälu piire, mis põhjustab mälu juurdepääsu aeg aeglasemalt kõrgema latentsuse vahemälu või põhimälu andmete hankimisest. Lükake, vältides juba massiivi andmeid, võib vahemälu paiknemist paremini kasutada.

Tuleb märkida, et tõuke muudab algse massiivi, samal ajal kui CONCAT säilitab uue massiivi tagastamisega muutumatuse. See erinevus on oluline rakenduse kujundamisel, kuid mõjutab ka jõudlust. Muutuvad ühendused CONCAT -iga ei taga mitte kõrvaltoimeid, vaid maksavad lisamälu ja kopeerimise hinda, samal ajal kui ka tehinguid kiiruse muutumatust välja lükkab, muutes lähtemassiivi otse.

Mõned nüansid hõlmavad seda, et JavaScripti mootorid võivad konteksti ja keerukuse põhjal neid toiminguid erinevalt optimeerida. Näiteks optimeerivad mootorid fikseeritud tüüpe või väikeseid massiive agressiivsemalt. Samuti toetab CONCAT -i meetodi allkiri samaaegselt mitmete massiivide ja väärtuste lisamist (â ülekoormatud allkirjad), mis nõuab sisemist lamendamis- ja kopeerimissamme, mis lisavad pea kohal, samas kui surub sirgjooneliselt elemente ilma sellise lamenemiseta.

Prügikogumise osas võivad CONCAT -iga seotud sagedased eraldamised suurendada prügiveo töökoormust, kuna pärast kopeerimist loobutakse vanad massiivid. See võib põhjustada pauside või jõudluse langusi kõrge jaotuse stsenaariumide korral. Push kasvab olemasolev massiiv vähendab eraldiste sagedust ja seega prügikogumist pea kohal.

Üldiselt hõlmab tõuke- ja CONCAT -i valimine kompromissi kiiruse (tõuke) ja muutumatuse/mugavuse (CONCAT) vahel. Suurte massiivide toimingute jaoks, mille prioriteediks on jõudlus, on Push üldiselt eelistatav meetod selle tõhusama mälu käitlemise ja alumise üldkulu tõttu. CONCATi üldkulud massiivi loomisest ja kopeerimisest muutuvad massiivi suuruse suurenedes väga kulukaks. Stsenaariumide korral, kus muutumatus on kriitiline, kasutatakse CONCAT -i vaatamata tulemuslikkuse karistusele.

Kokkuvõtlikult võib öelda, et Pushil on tavaliselt parem jõudlus ja madalam mälu üle pea kohal, võrreldes CONCAT-iga suurte massiivide kontekstis kohapealse muutmise, amortiseeritud pidevate aja lisamise ja vähendatud kopeerimise tõttu. Concat kannatab täiendavate mälude jaotuste ja kopeerimiskulude all, kuna see loob iga kord, kui seda nimetatakse, uue massiivi, mis mõjutab nii võetud aega kui ka mälu kasutamist, eriti väga suurte massiivide puhul. Neid erinevusi suurendatakse paljude massiivide ühendamisel või massiivsete andmekogumitega tegelemisel, kus push võib olla sadu kuni tuhandeid kordi kiirem kui CONCAT vastavalt võrdlusalustele. Sõltuvalt kasutamise kontekstist ja mootori optimeerimisest võivad need üldised mustrid olla erandid ja neid tuleks arvestada koos koodi muutumise ja säilitamise vajadusega.