Pri tipični uporabi JavaScript je metoda `push` na splošno hitrejša kot" concat ", ko gre za dodajanje elementov v matriko. Vendar pa obstajajo robni primeri in določeni konteksti, kjer je "concat" hitrejši ali ugodnejši. Razumevanje teh zahteva podroben pogled na notranje delovanje, vzorce uporabe, vedenje dodelitve pomnilnika in posebne primere uporabe obeh metod.
`Push` doda elemente obstoječemu nizu, tako da ga razširi na mesto. Originalni niz spreminja z dodajanjem novih elementov. Ker `Push` deluje na obstoječem nizu, se običajno izogne ustvarjanju novih matrikov in dodatnih pomnilnikov nad glavo. `Push` lahko sprejme več argumentov in kadar uporabljate z` Uporaba '(na primer `array.prototype.push.apply (arr1, arr2)`), lahko učinkovito doda vse elemente enega matrike v drugi. Ta mutacijski pristop je na splošno zelo hiter, saj se izogne ustvarjanju in kopiranju.
Po drugi strani pa "Concat" ne mutira izvirnega niza, ampak vrne nov niz, ki vsebuje kombinirane elemente izvirnega niza in priložene vrednosti. Ker `Concat` ustvarja novo matriko, vključuje dodelitev novega pomnilnika in kopiranje elementov iz izvirnih nizov v to novo matriko. Ta dodatna režija običajno naredi `concat` počasneje kot" push ". Številna merila meril kažejo, da je "Push" v številnih značilnih scenarijih več vrst velikosti kot "concat", zlasti tam, kjer so vključeni veliki nizi ali številni postopki združevanja.
Kljub temu, robne primere, kjer je lahko hitrejši "concat", vključujejo:
1. Ko se originalni niz pozneje ne uporablja:
Če originalni niz ni več potreben in je prednostna nespremenljiva operacija, je "Concat" včasih lahko učinkovitejši pri optimizacijah na visoki ravni, ker se izogne potencialnim režijskim stroškom od velikosti matrike ali notranje prerazporeditve, ki se lahko zgodi s ponavljajočimi se "push" operacijami. V takih primerih, zlasti pri V8 optimizacijah motorja, lahko ustvarjanje svežega niza koristi od bolj predvidljivih vzorcev pomnilnika.
2. Pri uporabi majhnih nizov ali nekaj elementov:
Za zelo majhne matrike ali kadar je število dodanih elementov minimalno, je razlika v hitrosti med `push` in` concat` lahko zanemarljiva. Včasih je zaradi notranjih optimizacij "Concat" lahko tako hiter ali nekoliko hitrejši, ker je režijski strošek "Application" za "push" lahko uravnotežil stroške kopiranja "concat".
3. Nepredrobljeni vzorci programiranja:
V nekaterih scenarijih funkcionalnega programiranja ali nespremenljivih podatkov je "Concat" naklonjen, ker ne mutira prvotnega niza. Čeprav to ni čisti dobiček hitrosti, lahko omogoči boljše optimizacije motorjev JavaScript, ki spodbujajo nespremenljivost, kot so strukturna delitev ali strategije za kopiranje na pisanje, zlasti v knjižnicah, zasnovanih okoli teh paradigm. V teh okoliščinah, čeprav ni značilna uporaba javascripta, lahko specializirane izvedbe povezovanje hitreje kot potiski, ki temeljijo na mutaciji.
4. Združevanje več nizov hkrati:
`Concat` lahko sprejme več argumentov (matrikov ali elementov) in samodejno izvede operacijo sploščenja. Pri združevanju številnih nizov v eni operaciji se lahko 'Concat` izogne več pozivi, da se pri nekaterih javascriptskih motorjih zmanjša "potiskanje" in zmanjšuje nad glavo. To je lahko hitrejše od zaporednih `push` klicev, kjer se vsak klic sproži nadgradi, povezano s širjenjem argumentov ali posodobitvami notranje dolžine niza.
5. Izogibanje funkcijskih klicev z režijskimi stroški z `push.apply`:
Ko se `Push` uporablja s` Uporaba "za širjenje matrike, lahko sproži omejitve motorja JavaScript o številu argumentov (spreminja se med brskalniki in različicami V8). Če velikost matrike presega to mejo, lahko `push.apply` v zmogljivosti dramatično ne uspe. "Concat" nima takšnih omejitev, zaradi česar je lahko hitrejša ali bolj zanesljiva za izjemno velike povezave.
6. manj dodeljevanja predmetov v nekaterih javascript motorjih za "concat":
Nekateri javascript motorji lahko optimizirajo "concat" pod posebno uporabo o svojih strategijah upravljanja notranjega pomnilnika. Na primer, motorji lahko optimizirajo `concat` z uporabo medpomnilnikov kopij na pisanju ali z vpisom notranjih nizov in s tem znižajo stroške kopiranja velikih nizov pod določenimi pogoji.
7. Uporaba v posebnih podatkovnih strukturah ali tipkanih nizih:
Pri delu s tipkanimi matriki ali posebnimi javascript predmeti, kot so nespremenljivi vektorji (v nekaterih knjižnicah), so metode združevanja po modeliranju po "Concat" lahko zasnovane tako, da zagotavljajo logaritmično kompleksnost, ne da bi v celoti kopirali matrike. V takšnih primerih osnovna zasnova podatkovne strukture omogoča združevanje, da presega preproste operacije `push`, ki neposredno mutirajo strukture podatkov.
8. Upoštevanje zbiranja smeti in pomnilnika:
V situacijah s težkim pomnilniškim tlakom ali pogostimi spremenjanjem lahko "Push" povzroči pogostejšo prerazporeditev in kopiranje v spodnjem pomnilniku matrike, kar sproži cikle odvzema smeti. "Concat` enkrat ustvari novo matriko, kar lahko omogoča bolj predvidljive vzorce odvzema smeti, kar lahko občasno izboljša uspešnost na splošno.
9. Enostavnost kode z večjimi povezavi:
Čeprav ni neposredno povezan s hitrostjo, je `contat` skladenjsko preprostejši za kombiniranje več nizov ali elementov brez širjenja ali zanke. To lahko zmanjša naključne režijske stroške od uporabniške kode, ki lahko izniči majhne razlike v uspešnosti.
10. Razlike v uspešnosti javascript motorjev in različice:
Različni javascript motorji (V8 v Chromu, Spidermonkey v Firefoxu, Javascriptcore v Safariju) te operacije drugače optimizirajo. Nekatere različice motorja bi lahko bile nerazložljivo optimizirane "concat" za posebne vzorce ali velikosti matrike, zato v tistih začasnih primerih, ki v redkih pogojih kažejo "Concat" kot hitrejše.
11. Izogibanje stranskim učinkom mutacije:
Uporaba `concat` pomaga preprečiti mutacijo, ki lahko v nekaterih odpravljanju napak ali razvojnih okoljev zmanjša režijske stroške, ki jih povzroča spremljanje sprememb matrike ali sproži reaktivne posodobitve v okvirih. Ta posredna hitrost lahko v določenih scenarijih na ravni aplikacije naredi "koncat".
12. Strategije poravnave in dodeljevanja spomina:
Motorji včasih optimizirajo dodelitve pomnilnika za matrike, ustvarjene z "Concat", kar vodi do racionaliziranega kopiranja ali skupne rabe medpomnilnikov, ki so lahko hitrejše od ponavljajočih se inkrementalnih `push" operacij, ki večkrat spreminjajo pomnilnik matrike.
Če povzamemo, medtem ko "Push" običajno v tipičnih merilih uspešnosti prekaša "concat", obstajajo robni primeri. Sem spadajo scenariji, ki zahtevajo nespremenljivost, ogromne matrike, ki presegajo omejitve argumentov, večnamenska povezava, specifične podatkovne strukture in optimizacije, specifične za motorja JavaScript. Vsak primer je močno odvisen od narave podatkov, notranje implementacije motorja in programskega konteksta. Razumevanje teh odtenkov razvijalcem pomaga izbrati pravo metodo, optimizirano za njihove posebne potrebe.
Skupni nasveti za uspešnost, da raje "potisne" za mutacijo matrike in združevanje, kadar je uspešnost kritična za več primerov, vendar ni absolutna. Za jasnost kode, nespremenljivost ali posebne optimizacije motorja je "Concat" lahko hitrejša ali zaželena pod določenimi ročnimi pogoji. Ta subtilnost je pomemben del razumevanja operacij javascript matrike na napredni ravni.