Let's talk about function.apply () skills in improving program performance.
Let's start with the Math.max () function, Math.max can be followed by any argument, and finally return the maximum value in all parameters.
Like what
Alert (Math.max (5,8))//8
Alert (Math.max (5,7,9,3,1,6))//9
But in many cases, we need to find the largest element in the array.
var arr=[5,7,9,1]
Alert (Math.max (ARR))//This is not the case. Be sure to write like this
function Getmax (arr) {
var arrlen=arr.length;
for (Var i=0,ret=arr[0];i<arrlen;i++) {
Ret=math.max (Ret,arr[i]);
}
return ret;
}
This is a cumbersome and inefficient way to write. If you apply it, look at the code:
function GetMax2 (arr) {
Return Math.max.apply (Null,arr)
}
The two pieces of code achieve the same goal, but GETMAX2 is elegant, efficient, and much simpler.
See Performance test:
Getmax Performance Test
<script>
var myarr=new Array ()
function Fillrnd (Arrlen) {//fill in a random number of Arrlen 1-10 to an array
for (Var i=0,arr=[];i<arrlen;i++) {
Arr[i]=math.ceil (Math.random () *10)
}
Return arr
}
function Getmax (arr) {
var arrlen=arr.length;
for (Var i=0,ret=arr[0];i<arrlen;i++) {
Ret=math.max (Ret,arr[i]);
}
return ret;
}
function GetMax2 (arr) {
Return Math.max.apply (Null,arr)
}
Myarr=fillrnd (20*10000)//Generate 200,000 random numbers fill in array
var t1=new Date ()
var Max1=getmax (Myarr)
var t2=new Date ()
var max2=getmax2 (Myarr)
var t3=new Date ()
if (MAX1!==MAX2) alert ("Error")
alert ([T3-T2,T2-T1])//On my machine 96,464. Different machines, the results may vary
</script>
By comparison of 200,000 data, the GETMAX2 time is 96ms and Getmax time is 464. 5 times times the difference.
Another example is the push method of an array.
var arr1=[1,3,4];
var arr2=[3,4,5];
If we want to expand the arr2, and then one by one append to the arr1, finally let arr1=[1,3,4,3,4,5]
Arr1.push (ARR2) is clearly not a good one. Because doing so will get [1,3,4, [3,4,5]]
We can only use one loop to go one push (of course we can also use Arr1.concat (ARR2) But concat method does not change arr1 itself)
var arrlen=arr2.length
for (Var i=0;i<arrlen;i++) {
Arr1.push (Arr2[i])
}
It's been so easy ever since the Apply
Array.prototype.push.apply (ARR1,ARR2)