The function is as follows:
Copy code The code is as follows:
function update_timelist(&$arr,$timestamp,$threshold){
$timequeue = &$arr['timequeue'];
while(!empty( $timequeue[0])&&($timestamp-$timequeue[0])>$threshold){
array_shift($timequeue);
}
array_push($timequeue, $timestamp);
if($arr['count ']$arr['count'] = count($timequeue);
}
}
Do you see any problems with this function? In fact, there is a big problem, which is the line in the function:
$timequeue = &$arr['timequeue'];
This line causes the program to read 22M data and generate the time node linked list, which takes nearly 40 seconds, and delete this line. Changing the line to directly use $arr['timequeue'] shortens the time by 30 seconds, and only takes about 10 seconds to process 22M.
Copy code The code is as follows:
function update_timelist(&$arr,$timestamp,$threshold){
while(!empty($arr['timequeue'][0])&&($timestamp- $arr['timequeue'][0])>$threshold){
array_shift($arr['timequeue']);
}
array_push($arr['timequeue'], $timestamp);
if($ arr['count']$arr['count'] = count($arr['timequeue']);
}
Everyone can see what it is Problem? The problem is with the count function, I didn’t think of it. PHP marks the real content space pointed by the variable as a reference type and a non-reference type, like the following code:
Copy the code The code is as follows:
$a = 'jb51.net';
$b = $a;
$c = $b;
actually only takes up one copy of the memory space, because PHP's zend engine uses the copy on writing mechanism, and will only make a copy when $b and $c are modified'jb51 .net'. At this time, the content space type of 'jb51.net' is a non-reference type. If it is changed to the following code:
Copy the code The code is as follows:
$a = 'jb51.net' ;
$b = $a;
$c = &$a;
What will happen to this? Is it still a memory space to store 'jb51.net'? No, because $c is a reference to $a, and the storage space pointed to by $a needs to be marked as a reference type, then a separate copy of 'jb51.net' must be made for $b, because $b points to a non-reference type. .
We can understand that $c is now a reference to $a. If $b still executes the space of $a, then modifying $c will cause $b to be modified as well. Therefore, once a reference appears, it must be copied even if there is no writing operation. A portion. It can also be understood that PHP has only two types of memory space pointed to by variables: non-reference and reference. The two types cannot be mixed or transferred. If you need to change the state of the memory space somewhere, you need to make a copy.
The following explains why adding $timequeue = &$arr['timequeue'] will cause count to slow down. Do you remember the calling process of the c function? In fact, the parameters we pass in need to be copied and passed in, and the same is true for PHP. However, due to the copy on writing mechanism, count will not actually be copied when passing in non-reference types, but $timequeue = &$arr['timequeue '] specifies the memory space of $timequeue as a reference type, and count requires a non-reference type, which causes count to need to copy a copy of $arr['timequeue']. Why is there no problem if I pass $arr['timequeue'] directly? Of course count uses the copy on writing mechanism. What about array_shift and array_push? They are passed in references. Don't worry, this is not modifying the type of $arr['timequeue'] but actually passing in an alias of $arr['timequeue'].
I have just started learning PHP. The above analysis may not be correct or comprehensive. You can communicate with me by sending emails and leaving messages on my homepage.
The above introduces how to improve work efficiency and the analysis of strange PHP reference efficiency problems, including how to improve work efficiency. I hope it will be helpful to friends who are interested in PHP tutorials.