今天在js交流群里有人發(fā)布了一個使用js實現(xiàn)數(shù)組回文和拷貝的任務(wù),然后大家開始各抒己見肥哎,正好手頭的事情完成的差不多了袒餐,就寫了寫這個實現(xiàn)的方法涤垫。
Array.prototype.copyReverse = function (n = 1) {
let myfinish=[];
let current=this.concat([]);
let flagitem=current.slice(1,current.length-1).concat(current.reverse());
for(let i=0;i<n;i++){
myfinish=myfinish.concat(flagitem);
}
myfinish=this.slice(0,1).concat(myfinish);
return myfinish;
}
let arr = [1,2,3,4,5];
console.log(arr);
console.log(arr.copyReverse());
console.log(arr.copyReverse(2));
函數(shù)運行結(jié)果
萬次執(zhí)行效率 2.788s
今天發(fā)現(xiàn)群里一哥們兒的方法速度奇快,比我們的算法快了100倍以上清焕,在此整理了一下copy過來好了并蝗,主要是我現(xiàn)在還不知道它為什么這么快((╯°□°)╯︵( .o.))!
Array.prototype.clone = function () { return this.slice(0); }
Array.prototype.copyReverse = function (num = 1) {
var that = this.clone();
var that1 = this.clone();
var returnArray = this.clone();
that.pop();
that1.shift();
var array1 = that.reverse();
var array2 = that1;
if (!isNaN(num) && num > 0) {
for (var i = 1; i <= num; i++) {
if (i === 1) {
for (var n = 0; n < array1.length; n++) {
returnArray.push(array1[n])
}
} else {
for (var y = 0; y < array2.length; y++) {
returnArray.push(array2[y])
}
for (var n = 0; n < array1.length; n++) {
returnArray.push(array1[n])
}
}
}
}
return returnArray;
};
var array = [1, 2, 3, 4, 5];
console.log(array.copyReverse(4));
群里哥們兒的解法 萬次 0.020s
經(jīng)過與群里的人的討論秸妥,經(jīng)過測試滚停,性能差異主要是體現(xiàn)在向數(shù)組添加元素的方法性能差異,在向數(shù)組添加元素時Array.push()
要比Array.concat()
擁有明顯的性能優(yōu)勢粥惧,具體的效率提升比沒有做測算键畴,但是在處理萬次以上時應(yīng)該首選使用Array.push()
來做數(shù)組添加。
所以可以對我的代碼進行一次優(yōu)化突雪,將循環(huán)添加數(shù)組元素從concat()
改為push()
起惕,經(jīng)過測試性能確實獲得了明顯的提升。
Array.prototype.copyReverse = function (n = 1) {
let myfinish=[];
let current=this.concat([]);
let flagitem=current.slice(1,current.length-1).concat(current.reverse());
for(let i=0;i<n;i++){
for(let j=0;j<flagitem.length;j++){
myfinish.push(flagitem[j]);
}
}
myfinish=this.slice(0,1).concat(myfinish);
return myfinish;
}
let arr = [1,2,3,4,5];
console.log(arr.copyReverse(10000));
改進后的執(zhí)行效率 萬次 0.005s
今天發(fā)現(xiàn)
push()
在30個之后性能會低于concat()
咏删,于是又挖了挖性能瓶頸惹想,發(fā)現(xiàn)push()
是在原數(shù)組上進行操作,而concat()
是返回一個新的數(shù)組督函,不斷返回新的數(shù)組將新的數(shù)組賦值給原數(shù)組造成了性能的下降嘀粱,使用jsperf跑了一下測試用例,結(jié)果如下:concat()和push()以及concat()僅執(zhí)行不賦值的性能比較