Οι συνέπειες της απόδοσης της χρήσης PUSH έναντι CONCAT σε μεγάλες συστοιχίες προκύπτουν κυρίως από τους διαφορετικούς τρόπους με τους οποίους αυτές οι μέθοδοι χειρίζονται τη συσσώρευση συστοιχίας ή την προσθήκη στοιχείων, καθώς και την υποκείμενη διαχείριση μνήμης και τα υπολογιστικά γενικά έξοδα.
Όταν χρησιμοποιείτε το Array.push, τα στοιχεία από έναν πίνακα προσαρτάνται απευθείας στον υπάρχοντα πίνακα. Για τη συγχώνευση των συστοιχιών, αυτό συχνά περιλαμβάνει ένα μοτίβο όπως η χρήση της εφαρμογής ή ο χειριστής εξάπλωσης για να ωθήσει πολλαπλά στοιχεία ταυτόχρονα, για παράδειγμα, Array.prototype.push.apply (arr1, arr2). Αυτή η προσέγγιση τροποποιεί τον αρχικό πίνακα στη θέση του και γενικά εκτελεί σε γραμμικό χρόνο, o (n), όπου n είναι ο αριθμός των στοιχείων που πιέζονται. Ο λόγος είναι ότι η ώθηση συνήθως προσαρτάται στοιχεία στο τέλος της υπάρχουσας συστοιχίας χωρίς να δημιουργεί μια νέα συστοιχία ή να αντιγράφει επανειλημμένα ολόκληρο το περιεχόμενο. Λόγω αυτής της επιτόπιας μετάλλαξης, ελαχιστοποιείται η επιβάρυνση της μνήμης και η μέθοδος συχνά εκμεταλλεύεται βελτιστοποιημένα τα συνεχόμενα μπλοκ μνήμης και την τοποθεσία cache, μειώνοντας το κόστος πρόσβασης μνήμης.
Αντίθετα, το Array.Concat δεν τροποποιεί τις αρχικές συστοιχίες. Αντ 'αυτού, δημιουργεί μια νέα συστοιχία που περιέχει τα στοιχεία των αρχικών συστοιχιών που συνδέονται μαζί. Η δημιουργία αυτού του νέου πίνακα συνεπάγεται την κατανομή μνήμης για το συνδυασμένο μέγεθος των συστοιχιών και τα στοιχεία αντιγραφής και από τις δύο συστοιχίες πηγών σε αυτόν τον πρόσφατα κατανεμημένο χώρο. Αυτή η αντιγραφή εισάγει ένα γενικό κόστος που είναι γενικά ανάλογη με το μέγεθος και των δύο συστοιχιών, καθιστώντας την πολυπλοκότητα του χρόνου O (M + N), όπου m και n είναι τα μεγέθη των συστοιχιών που συνδέονται. Η δημιουργία ενός νέου πίνακα και αντιγραφής δεδομένων έχει ως αποτέλεσμα αυξημένη χρήση μνήμης και υψηλότερη πιθανότητα να ενεργοποιηθεί η συλλογή σκουπιδιών, ειδικά αισθητή με πολύ μεγάλες συστοιχίες.
Οι δοκιμές αναφοράς δείχνουν σταθερά ότι η ώθηση μπορεί να είναι σημαντικά ταχύτερη από ό, τι για τις επιχειρήσεις που περιλαμβάνουν συγχώνευση ή προσθήκη μεγάλου αριθμού στοιχείων. Για παράδειγμα, ένα σημείο αναφοράς έδειξε ότι για τη συγχώνευση συστοιχιών με χιλιάδες στοιχεία επανειλημμένα, το Push ήταν περίπου 945 φορές ταχύτερο από το concat στο Chrome και ακόμη ταχύτερα στον Firefox. Αυτή η τεράστια διαφορά προέρχεται από τη συμπεριφορά της Concat για τη δημιουργία ενός νέου πίνακα και την αντιγραφή δεδομένων επανειλημμένα, ενώ η ώθηση αναπτύσσει την υπάρχουσα συστοιχία πιο σταδιακά και στη θέση του, αποφεύγοντας τις επαναλαμβανόμενες ανακατασκευές μνήμης.
Ωστόσο, αυτά τα χαρακτηριστικά απόδοσης ενδέχεται να διαφέρουν ανάλογα με τα σενάρια χρήσης. Εάν ο στόχος είναι μια ενιαία συγκόλληση δύο πολύ μεγάλων προ-δηλωμένων συστοιχιών, το Concat μπορεί να εκτελέσει σχετικά καλά, αφού κατανέμεται μία φορά και κάνει το αντίγραφο μία φορά. Σε τέτοιες περιπτώσεις, η προσέγγιση του Push-by-one ή της παρτίδας θα μπορούσε να προκαλέσει πολλαπλές ανακατασκευές ή να αντιγραφεί εσωτερικά, γεγονός που θα μπορούσε να μειώσει το θεωρητικό πλεονέκτημά του. Παρ 'όλα αυτά, για επανειλημμένη συγχώνευση ή προσθήκη πολλών στοιχείων σε πολλές συστοιχίες, η ώθηση τείνει να αποσβένει το O (1) ανά προσθήκη, επειδή οι συστοιχίες συχνά κατανέμουν τη μνήμη γεωμετρικά (διπλασιαστική χωρητικότητα όταν υπερβαίνει), καθιστώντας την εξαιρετικά αποτελεσματική συνολική.
Από την άποψη της μνήμης, η μετάλλαξη του Push στο χώρο σημαίνει λιγότερο συχνές κατανομές και ενδεχομένως λιγότερη πίεση στο υποσύστημα μνήμης. Η μέθοδος Concat, η οποία απαιτεί νέες κατανομές και αντιγράφων δεδομένων μέσω εκ νέου, τονίζει τη μνήμη και αποθηκεύει περισσότερο, ειδικά για μεγάλες συστοιχίες. Αυτή η κατάσταση οδηγεί σε λειτουργίες CONCAT που ενδεχομένως υπερβαίνουν τα όρια της προσωρινής μνήμης CPU, οδηγώντας σε βραδύτερους χρόνους πρόσβασης μνήμης λόγω της λήψης δεδομένων από τις κρυφές μνήμης υψηλότερης καθυστέρησης ή την κύρια μνήμη επανειλημμένα. Η ώθηση, αποφεύγοντας την επανεξέταση στα δεδομένα ήδη στον πίνακα, μπορεί να εκμεταλλευτεί την τοποθεσία της προσωρινής μνήμης καλύτερα.
Θα πρέπει να σημειωθεί ότι η ώθηση μεταβάλλει τον αρχικό πίνακα, ενώ το Concat διατηρεί την αμετάβλητη επιστρέφοντας έναν νέο πίνακα. Αυτή η διαφορά είναι σημαντική στο σχεδιασμό εφαρμογών, αλλά επηρεάζει επίσης την απόδοση. Οι αμετάβλητες συνειδητοποιήσεις με εγγύηση Concat δεν υπάρχουν παρενέργειες, αλλά πληρώνουν την τιμή της πρόσθετης μνήμης και της αντιγραφής, ενώ προωθήστε τις συναλλαγές από την αμετάβλητη ταχύτητα τροποποιώντας απευθείας τη συστοιχία πηγής.
Ορισμένες αποχρώσεις περιλαμβάνουν ότι οι κινητήρες JavaScript θα μπορούσαν να βελτιστοποιήσουν αυτές τις λειτουργίες διαφορετικά με βάση το πλαίσιο και την πολυπλοκότητα. Για παράδειγμα, οι κινητήρες βελτιστοποιούν τους σταθερούς τύπους ή τις μικρές συστοιχίες πιο επιθετικά. Επίσης, η υπογραφή της μεθόδου Concat υποστηρίζει ταυτόχρονα να προσθέτει πολλαπλές συστοιχίες και τιμές (υπερφορτωμένες υπογραφές), οι οποίες απαιτούν εσωτερικά βήματα ισοπέδωσης και αντιγραφής που προσθέτουν πάνω από το κεφάλι, ενώ η ώθηση απλή προσθέτει στοιχεία χωρίς τέτοια ισοπαλία.
Όσον αφορά τη συλλογή σκουπιδιών, οι συχνές κατανομές που εμπλέκονται στο CONCAT μπορούν να αυξήσουν το φόρτο εργασίας συλλογής σκουπιδιών, επειδή οι παλιές συστοιχίες απορρίπτονται μετά την αντιγραφή. Αυτό μπορεί να οδηγήσει σε παύσεις ή μειώσεις απόδοσης σε σενάρια υψηλής κατανομής. Η αύξηση του Push Outling a examping array μειώνει τη συχνότητα των κατανομών και επομένως τη συλλογή σκουπιδιών πάνω από το κεφάλι.
Συνολικά, η επιλογή μεταξύ Push και Concat περιλαμβάνει ένα εμπόδιο μεταξύ της ταχύτητας (ώθησης) και της αμετάβλητης/ευκολίας (concat). Για τις λειτουργίες σε μεγάλες συστοιχίες με την απόδοση ως προτεραιότητα, η ώθηση είναι γενικά η προτιμώμενη μέθοδος λόγω του πιο αποτελεσματικού χειρισμού μνήμης και του χαμηλότερου επιβάρυνσης. Τα γενικά έξοδα της Concat από τη δημιουργία και την αντιγραφή του πίνακα γίνεται πολύ δαπανηρό καθώς αυξάνονται τα μεγέθη των συστοιχιών. Σε σενάρια όπου η αμετάβλητη είναι κρίσιμη, χρησιμοποιείται το Concat παρά την ποινή απόδοσης.
Συνοπτικά, η ώθηση συνήθως παρουσιάζει καλύτερη απόδοση και χαμηλότερη επιβάρυνση μνήμης σε σύγκριση με το CONCAT στο πλαίσιο μεγάλων συστοιχιών λόγω της τροποποίησης της επιτόπιας, των αποσβέσεων προσαρτήσεων σταθερού χρόνου και της μειωμένης αντιγραφής. Το CONCAT υποφέρει από πρόσθετες κατανομές μνήμης και αντιγραφή του κόστους, επειδή δημιουργεί μια νέα συστοιχία κάθε φορά που ονομάζεται, η οποία επηρεάζει τόσο το χρόνο που λαμβάνεται όσο και τη χρήση μνήμης, ειδικά με πολύ μεγάλες συστοιχίες. Αυτές οι διαφορές μεγεθύνονται όταν συγχωνεύονται πολλές συστοιχίες ή ασχολούνται με τεράστια σύνολα δεδομένων, όπου η ώθηση μπορεί να είναι εκατοντάδες έως χιλιάδες φορές ταχύτερα από το concat σύμφωνα με τα σημεία αναφοράς. Ωστόσο, ανάλογα με το πλαίσιο χρήσης και τις βελτιστοποιήσεις των κινητήρων, αυτά τα γενικά πρότυπα μπορούν να έχουν εξαιρέσεις και πρέπει να εξεταστούν παράλληλα με την ανάγκη για αμετάβλητη και συντηρητικότητα κώδικα.