Leistung
Ich analysiere die aktuellen Lösungen und schlage 2 neue vor (F und G werden im Detail vorgestellt), die für kleine und mittlere Arrays extrem schnell sind
Heute 2020.11.13 Ich führe Tests auf MacOs HighSierra 10.13.6 auf Chrome v86, Safari v13.1.2 und Firefox v82 für ausgewählte Lösungen
Ergebnisse
Für alle Browser
- Lösungen basierend auf
while-pop-unshift
(F,G) sind (extrem) schnell auf allen Browsern für kleine und mittelgroße Arrays. Für Arrays mit 50000 Elementen verlangsamt sich diese Lösung in Chrome
- Lösungen C,D für Felder mit 500000 Pausen: "RangeError: Maximale Aufrufstapelgröße überschritten
- Lösung (E) ist am langsamsten
![enter image description here]()
Einzelheiten
Ich führe 2 Testfälle durch:
- wenn Arrays 10 Elemente haben - Sie können es ausführen HIER
- wenn Arrays 10k Elemente haben - Sie können es ausführen HIER
Der folgende Ausschnitt zeigt die Unterschiede zwischen den Lösungen A , B , C , D , E , F(my), G(my), H , I
// https://stackoverflow.com/a/4156145/860099
function A(a,b) {
return a.concat(b);
}
// https://stackoverflow.com/a/38107399/860099
function B(a,b) {
return [...a, ...b];
}
// https://stackoverflow.com/a/32511679/860099
function C(a,b) {
return (a.push(...b), a);
}
// https://stackoverflow.com/a/4156156/860099
function D(a,b) {
Array.prototype.push.apply(a, b);
return a;
}
// https://stackoverflow.com/a/60276098/860099
function E(a,b) {
return b.reduce((pre, cur) => [...pre, cur], a);
}
// my
function F(a,b) {
while(b.length) a.push(b.shift());
return a;
}
// my
function G(a,b) {
while(a.length) b.unshift(a.pop());
return b;
}
// https://stackoverflow.com/a/44087401/860099
function H(a, b) {
var len = b.length;
var start = a.length;
a.length = start + len;
for (var i = 0; i < len; i++ , start++) {
a[start] = b[i];
}
return a;
}
// https://stackoverflow.com/a/51860949/860099
function I(a, b){
var oneLen = a.length, twoLen = b.length;
var newArr = [], newLen = newArr.length = oneLen + twoLen;
for (var i=0, tmp=a[0]; i !== oneLen; ++i) {
tmp = a[i];
if (tmp !== undefined || a.hasOwnProperty(i)) newArr[i] = tmp;
}
for (var two=0; i !== newLen; ++i, ++two) {
tmp = b[two];
if (tmp !== undefined || b.hasOwnProperty(two)) newArr[i] = tmp;
}
return newArr;
}
// ---------
// TEST
// ---------
let a1=[1,2,3];
let a2=[4,5,6];
[A,B,C,D,E,F,G,H,I].forEach(f=> {
console.log(`${f.name}: ${f([...a1],[...a2])}`)
})
Und hier sind Beispielergebnisse für Chrom
![enter image description here]()