A push és a concat nagy tömbökben történő felhasználásának teljesítményének következményei elsősorban azokból származnak, amelyek ezeknek a módszereknek a különféle módjaiból származnak, amelyek kezelik a tömb összeolvadását vagy az elemek hozzáadását, valamint az alapjául szolgáló memóriakezelést és számítási fejüket.
A tömb.push használatakor az egyik tömb elemeit közvetlenül a meglévő tömbhez csatolják. A tömbök egyesítéséhez ez gyakran olyan mintát foglal magában, mint például az Applise használata vagy a Spread Operator, hogy több elem egyszerre nyomja meg például a tömb.prototype.push.apply (ARR1, ARR2). Ez a megközelítés módosítja az eredeti tömböt a helyén, és általában lineáris időben, o (n), ahol n a tolja az elemek számát. Ennek oka az, hogy a push az elemeket általában a meglévő tömb végéhez csatolja, anélkül, hogy új tömböt hozna létre, vagy a teljes tartalmat többször másolja. Ennek a helyen belüli mutációnak köszönhetően a memória fölött van minimalizálva, és a módszer gyakran használja az optimalizált szomszédos memóriablokkokat és a gyorsítótár-helységet, csökkentve a memória hozzáférésének költségeit.
Ezzel szemben a tömb.concat nem módosítja az eredeti tömböket. Ehelyett egy új tömböt hoz létre, amely tartalmazza az összeillesztett eredeti tömbök elemeit. Az új tömb létrehozása magában foglalja a memória elosztását a tömbök kombinált méretére és az elemek másolására mindkét forrás tömbből ebbe az újonnan elosztott térbe. Ez a másolás bevezet egy olyan költséget, amely általában arányos a két tömb méretével, így a művelet idő bonyolultságát (M + N), ahol M és N a tömbök méretének méretei. Egy új tömb létrehozása és másolási adatok létrehozása megnövekedett memóriafelhasználást és nagyobb valószínűségét eredményezi a szemétgyűjtés kiváltásának, különösen nagyon nagy tömbökkel észrevehető.
A benchmark -tesztek következetesen azt mutatják, hogy a PUSH jelentősen gyorsabb lehet, mint a COCAT, mint a nagyszámú elem összeolvadásával vagy hozzáadásával járó műveletekhez. Például egy referenciaérték bebizonyította, hogy a tömbök több ezer elemének többszöri összeolvasztásakor a tolás nagyjából 945 -szer gyorsabb volt, mint a krómban, és még a Firefoxban is gyorsabb volt. Ez a hatalmas különbség a CONCAT viselkedéséből származik, amikor új tömb létrehozását és adatokat másolnak, míg a PUSH a meglévő tömböt fokozatosabban és a helyén növeli, elkerülve az ismételt memóriaelosztást.
Ezek a teljesítményjellemzők azonban a felhasználási forgatókönyvektől függően változhatnak. Ha a cél két nagyon nagy, előre kiosztott tömb egyetlen összekapcsolódása, akkor a Concat viszonylag jól teljesít, mivel egyszer elosztja, és egyszer megteszi a másolatot. Ilyen esetekben a PUSH egy-egy vagy kötegelt függelék-megközelítése többszörös átcsoportosítást vagy belsőleg másolást okozhat, ami csökkentheti annak elméleti előnyeit. Mindazonáltal, az ismételt egyesülésekhez vagy sok elem hozzáadásához sok tömbön keresztül a PUSH -t általában o (1) amortizálják, mivel a tömbök gyakran geometriailag elosztják a memóriát (duplázási képesség, ha túllépik), ezáltal rendkívül hatékony.
Memória szempontjából a Push helyen lévő mutációja ritkábban gyakori allokációkat és potenciálisan kevesebb feszültséget jelent a memória alrendszerben. A CONCAT módszer, amely új allokációkat igényel, és az adatok újbóli részét igényli, jobban hangsúlyozza a memóriát és a gyorsítótárakat, különösen a nagy tömböknél. Ez a helyzet azt eredményezi, hogy a CONCAT műveletek meghaladják a CPU gyorsítótár-korlátait, ami lassabb memória-hozzáférési időket eredményez, mivel a magasabb késleltetésű gyorsítótárakból vagy a fő memóriából származó adatokat többször le lehet gyűjteni. Push, elkerülve az adatokra már a tömbben szereplő információkat, jobban kihasználhatja a gyorsítótár helyét.
Meg kell jegyezni, hogy a tolás megváltoztatja az eredeti tömböt, míg a CONCAT megőrzi a változhatatlanságot egy új tömb visszaküldésével. Ez a különbség fontos az alkalmazás tervezésében, de befolyásolja a teljesítményt is. A CONCAT -val való változhatatlan összekapcsolások nem garantálják a mellékhatásokat, hanem fizetik az extra memória árát és a másolást, miközben a forrás tömb közvetlen módosításával a sebesség megváltoztathatatlanságát a sebesség megváltoztathatatlanságának elnyerése.
Egyes árnyalatok között szerepel, hogy a JavaScript motorok a kontextus és a bonyolultság alapján eltérően optimalizálhatják ezeket a műveleteket. Például a motorok agresszívebben optimalizálják a rögzített típusokat vagy a kis tömböket. Ezenkívül a Concat módszer aláírása támogatja a több tömb és érték hozzáadását egyidejűleg (Â túlterhelt aláírások), amely megköveteli a belső simítási és másolási lépéseket, amelyek hozzáadják a fejet, míg a tolás egyszerűen hozzáadja az elemeket az ilyen simítás nélkül.
Ami a szemétgyűjtést illeti, a COCAT -ban részt vevő gyakori allokációk növelhetik a szemétgyűjtés munkaterhelését, mivel a régi tömbök másolás után eldobnak. Ez szünetekhez vagy teljesítménycsökkenéshez vezethet a magas elosztási forgatókönyvekben. A PUSH növekvő meglévő tömbje csökkenti az allokációk gyakoriságát, és ezáltal a feje fölött.
Összességében a Push és a Concat közötti választás magában foglalja a sebesség (push) és a változhatóság/kényelem (COCAT) közötti kompromisszumot. A nagy tömbökkel végzett műveletek esetén, amelyek prioritásként szolgálnak, a PUSH általában a jobb memóriakezelés és az alacsonyabb költségek miatt a PUSH. A Concat a tömb létrehozásától és másolásától kezdve nagyon költségessé válik, amikor a tömbméretek növekednek. Azokban a forgatókönyvekben, amelyekben a változhatatlanság kritikus jelentőségű, a teljesítménybüntetés ellenére használják a CONCAT -ot.
Összefoglalva: a PLING általában jobb teljesítményt és alacsonyabb memóriát mutat a COCAT-hoz képest, a nagy tömbökkel összefüggésben, a helyen belüli módosítás, az amortizált állandó idő-mellékletek és a csökkent másolás miatt. A CONCAT további memória -allokációktól és másolási költségektől szenved, mivel minden egyes híváskor új tömböt hoz létre, amely befolyásolja mind az időt, mind a memória használatát, különösen a nagyon nagy tömböknél. Ezek a különbségek nagyra növelik, ha sok tömböt egyesülnek, vagy ha a hatalmas adatkészletekkel foglalkoznak, ahol a PUSH a referenciaértékek szerint több százszor több ezer -szoros lehet, mint a Concat. A használati kontextustól és a motor optimalizálásától függően azonban ezeknek az általános mintáknak kivételei lehetnek, és figyelembe kell venni a kód megváltoztathatatlanságának és karbantarthatóságának szükségességét.