Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Kādas ir spiediena un concat izmantošanas sekas lielos blokos


Kādas ir spiediena un concat izmantošanas sekas lielos blokos


Push vai concat izmantošanas sekas lielos masīvos galvenokārt rodas no dažādiem veidiem, kā šīs metodes apstrādā masīva apvienošanos vai elementu pievienošanu, kā arī to pamatā esošo atmiņas pārvaldību un skaitļošanas pieskaitāmās izmaksas.

Izmantojot masīvu.Push, elementi no viena masīva tiek pievienoti tieši esošajam masīvam. Lai apvienotu masīvus, tas bieži ietver tādu modeli kā lietošana vai izkliedēšanas operators, lai uzreiz virzītu vairākus elementus, piemēram, masīvi.prototipe.push.apply (arr1, arr2). Šī pieeja modificē oriģinālo masīvu vietā un parasti darbojas lineārā laikā, o (n), kur n ir stumšanas elementu skaits. The reason is that push typically appends elements to the end of the existing array without creating a new array or copying the entire contents repeatedly. Sakarā ar šo mutāciju vietā, atmiņas pieskaitāmās izmaksas tiek samazinātas līdz minimumam, un metode bieži izmanto optimizētus blakus esošos atmiņas blokus un kešatmiņas atrašanās vietu, samazinot atmiņas piekļuves izmaksas.

Turpretī masīva.concat nemaina oriģinālos masīvus. Tā vietā tas izveido jaunu masīvu, kurā ir oriģinālo masīvu elementi, kas savienoti kopā. Šī jaunā masīva izveidošana ietver atmiņas piešķiršanu masīvu kombinētajam lielumam un elementu kopēšanai no abiem avota masīviem šajā tikko piešķirtajā telpā. Šī kopēšana ievieš pieskaitāmās izmaksas, kas parasti ir proporcionālas abu masīvu lielumam, padarot operācijas laika sarežģītību O (M + N), kur m un n ir masīvu izmēri. Jauna masīva izveidošana un datu kopēšana palielina atmiņas izmantošanu un lielāku varbūtību izraisīt atkritumu savākšanu, īpaši pamanāmu ar ļoti lieliem blokiem.

Etalona testi konsekventi parāda, ka spiediens var būt ievērojami ātrāks nekā konkāts operācijām, kas saistītas ar lielu skaitu elementu apvienošanu vai pievienošanu. Piemēram, viens etalons parādīja, ka, lai atkārtoti apvienotu bloku ar tūkstošiem elementu, spiediens bija aptuveni 945 reizes ātrāks nekā hromā un vēl ātrāks Firefox. Šīs milzīgās atšķirības rodas no Concat izturēšanās, lai atkārtoti izveidotu jaunu masīvu un kopētu datus, turpretī Push palielina esošo masīvu pakāpeniski un vietā, izvairoties no atkārtotām atmiņas pārdalījumiem.

Tomēr šīs veiktspējas īpašības var atšķirties atkarībā no lietošanas scenārijiem. Ja mērķis ir divu ļoti lielu iepriekš pievienotu bloku vienota saliekšana, CONCAT varētu darboties salīdzinoši labi, jo tas vienreiz sadalās un vienreiz kopija. Šādos gadījumos Push viena pa vienai vai pakešu pievienošanai var izraisīt vairākas pārdalīšanas vai kopēšanas iekšēji, kas varētu samazināt tās teorētiskās priekšrocības. Neskatoties uz to, atkārtotai apvienošanai vai daudzu elementu pievienošanai daudzos blokos, pusi mēdz amortizēt o (1) katram papildinājumam, jo ​​masīvi bieži piešķir atmiņu ģeometriski (dubultojoties ar spēju, ja tos pārsniedz), padarot to kopumā ļoti efektīvu.

Raugoties no atmiņas viedokļa, Push iekšējā mutācija nozīmē retāku piešķīrumu un potenciāli mazāku slodzi atmiņas apakšsistēmā. Concat metode, kurai nepieciešami jauni piešķīrumi un kopijas dati par no jauna, stresa atmiņu un kešatmiņu vairāk, īpaši lieliem masīviem. Šīs situācijas rezultātā tiek veiktas operācijas, kas, iespējams, pārsniedz CPU kešatmiņas ierobežojumus, izraisot lēnāku atmiņas piekļuves laiku, pateicoties datiem no augstākas latentuma kešatmiņas vai galvenās atmiņas. Push, izvairoties no datiem, kas jau ir masīvā, var labāk izmantot kešatmiņu.

Jāatzīmē, ka Push maina oriģinālo masīvu, kamēr Concat saglabā nemainīgumu, atgriežot jaunu masīvu. Šī atšķirība ir svarīga lietojumprogrammu projektēšanā, bet arī ietekmē veiktspēju. Nemainīgas sasaistes ar concat garantiju nav blakusparādību, bet maksājiet papildu atmiņas un kopēšanas cenu, savukārt spiediens uz ātruma nemainīgumu, tieši modificējot avota masīvu.

Dažas nianses ietver to, ka JavaScript dzinēji varētu optimizēt šīs darbības atšķirīgi, pamatojoties uz kontekstu un sarežģītību. Piemēram, dzinēji agresīvāk optimizē fiksētus tipus vai mazus masīvus. Arī Concat metodes paraksts atbalsta vairākus masīvus un vērtības vienlaicīgi (pārslogotus parakstus), kam nepieciešami iekšēji saplacināšana un kopēšana, kas pievieno virs galvas, turpretī tiešu virzienā uz priekšu pievieno elementus bez šādas izlīdzināšanas.

Attiecībā uz atkritumu savākšanu bieži iesaistītie piešķīrumi var palielināt atkritumu savākšanas darba slodzi, jo vecie bloki pēc kopēšanas tiek izmesti. Tas var izraisīt pauzes vai veiktspējas kritumu lielos sadales scenārijos. Push pieaugošais esošais masīvs samazina piešķīrumu biežumu un tādējādi atkritumu savākšanu virs galvas.

Kopumā izvēle starp push un concat ietver kompromisu starp ātrumu (push) un nemainīgumu/ērtībām (concat). Darbībai lielos blokos ar veiktspēju kā prioritāti Push parasti ir vēlamā metode, pateicoties tās efektīvākai atmiņas apstrādei un zemākām pieskaitāmām izmaksām. Concat pieskaitāmās izmaksas no masīva izveidošanas un kopēšanas kļūst ļoti dārgi, jo palielinās masīva izmēri. Scenārijos, kad nemainīgums ir kritisks, tiek izmantots CONCAT, neskatoties uz veiktspējas sodu.

Rezumējot, Push parasti uzrāda labāku veiktspēju un zemākas atmiņas pieskaitāmās izmaksas, salīdzinot ar Concat lielo masīvu kontekstā, ko rada virkne modifikācijas, amortizēja nemainīgu laiku pielikumus un samazinātu kopēšanu. Concat cieš no papildu atmiņas piešķīrumiem un izmaksu kopēšanas, jo tas katru reizi, kad to sauc, rada jaunu masīvu, kas ietekmē gan uzņemšanu, gan atmiņas izmantošanu, it īpaši ar ļoti lieliem blokiem. Šīs atšķirības tiek palielinātas, apvienojot daudzus masīvus vai nodarbojoties ar masīvām datu kopām, kur spiediens var būt simtiem līdz tūkstošiem reižu ātrāks nekā konkāts saskaņā ar etaloniem. Tomēr atkarībā no lietošanas konteksta un motora optimizācijas šiem vispārīgajiem modeļiem var būt izņēmumi, un tie būtu jāapsver līdztekus vajadzībai pēc koda nemaināmības un uzturējamības.