일. 서언
블로거들이 최근 엘라스틱서치 프로젝트를 진행하면서 찾아낸 데이터가 모두 배열돼 있어 데이터를 선별해 조립할 때 리볼빙하는 문제를 피할 수 없다.만약 50,000의 두 배열이 순환적으로 중첩된다면, 실제 연산은 50,000*50,000의 연산량으로 프로그램 실행 속도에 큰 영향을 미칠 수 있다.이 글은 주로 블로거가 프로그램을 최적화하는 과정을 기록한다.
2. 프로그램 성능 테스트 도구
먼저 몇 가지 테스트 도구를 제공하면, 우리가 어떤 프로그램을 시간이 오래 걸리고 메모리를 많이 차지하는지 확실히 알 수 있다.
1, 테스트 프로그램 실행 시간의 함수:
/*
*php 밀리초 단위의 코드를 입력하십시오
* */
function msectime() {
list($msec, $sec) = explode(' ', microtime());
$msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
return $msectime;
}
이 프로그램을 차용해 함수 실행 속도를 측정하면 밀리초 단위로 출력은 밀리초 단위로 출력한다.이 함수에 대해서 앞의 문장을 참조하시오.
php는 현재 시간의 밀리초 수를 획득하고 이를 이용하여 코드 세그먼트 실행 시간을 테스트합니다.
2. php 메모리 사용
echo "현재 메모리 사용 중: ".memory_get_usage()." 바이트 \n";
echo "메모리 피크: ".memory_get_peak_usage()." 바이트 \n";
여기서, 프로그램 실행으로 소비되는 메모리는 현재 메모리 점유량의 차분을 획득하여 판단된다.메모리의 피크를 통해 어떤 부분이 가장 많이 소비되는지를 파악해 메모리 누출을 막는다.
3.최적화 시작
1,부분함수 최적화
블로거가 테스트할 때 update Funnel 함수가 있어 4s의 시간이 걸렸는데, 이 함수는 단일 루프일 뿐인데 왜 이렇게 많은 시간을 차지합니까?메모리가 부족합니다. 나중에 바이두.발견, 다 in_array는 이상한 짓을 하고 있다
in_array() 대신 isset( ) 사용
원래: in_array($key,$a)
고치다: $b = array_flip($a);
isset($b[$key]);
최적화 후 updateFunnel의 시간은 2.4s입니다.
2, 배열 중첩 루프 최적화
원래 함수:
foreach($this->arrEsIndex as $key=>&$val){
foreach($this->arrEsIndex as $k=>$v) {
if ($val['pixel.uuid'] == $v['pixel.uuid']) {
if ($v['pixel.type'] == $this->login_step_val) {
$val[$this->login_step] = 1;
$val['pixel.user_id'] = $v['pixel.user_id'];
}
}
}
}
unset($val);
unset($v);
시간을 소모하다:7.03-0.7 = 6.33s
최적화 후:
$newArr = array();
foreach($this->arrEsIndex as $key=>$val){
$newArr[$val['pixel.uuid']] = $val;
}
foreach($this->arrEsIndex as $k=>&$v){
if(isset($newArr[$v['pixel.uuid']])){
if($newArr[$v['pixel.uuid']]['pixel.type'] == $this->login_step_val){
$v[$this->login_step] = 1;
$v['pixel.user_id'] = $newArr[$v['pixel.uuid']]['pixel.user_id'];
}
}
}
unset($newArr);
시간을 소모하다: 0.751 - 0.748 = 0.03s
우리는 두 개의 배열의 루프를 하나의 배열의 루프로 바꾸고, iset()과 같은 내장 함수를 동시에 사용하여 비교 속도를 빠르게 함으로써, 최종적인 최적화 효과를 얻을 수 있다.하지만 이것은 우리가 코드를 쓸 때, 기능 구현에만 집중하지 말고, 반드시 다 쓴 후에 속도를 측정해야 하는 문제를 설명한다.물론 묵시적 룰을 엄격히 따르는 것이 좋겠지만, 이런 식의 대규모 수구 순환보다는 원래 병가대기다.
3. 메모리 피크의 최적화
우리 php 프로그램의 메모리에는 한계가 있으며 php.ini에서는 memory_limit에 의해 정의된다.일반적으로 로컬 구성은 128M입니다. 대부분의 경우 사용할 수 있습니다. 프로그램에서 메모리가 부족하면 프로그램을 최적화해야 합니다.일부 블로거들은 메모리 리미트 설정을 늘리는 방안을 내놓지만, 근본 대책은 아깝다.먼저 프로그램을 최적화하는 것을 추천합니다.
블로거가 프로그램을 테스트하다 메모리의 피크가 135M 안팎으로 정해진 메모리를 초과한 것을 발견하면 무엇이 문제일까.인쇄 메모리의 피크를 한 단계씩 거쳐 최종적으로 하나의 배열 변수에 고정시킨 후, 이 배열 변수를 해제한 후, 메모리는 단번에 떨어졌고 피크는 80M으로 유지되었다.이 부분에는 코드를 붙일 수 없습니다. 여러분도 비슷한 상황이 발생하면 절차를 자세히 테스트해 보면 됩니다.。
php의 메모리 최적화에 대해서는 나의 또 다른 문장을 참고하면 도움이 될 것이다.
php 프로그램 메모리 최적화 배열 동작 최적화
'개발 꿀팁 > PHP' 카테고리의 다른 글
PHP의 CI 프레임워크 학습 (0) | 2022.07.21 |
---|---|
php 프로그램 메모리 최적화 배열 동작 최적화 (0) | 2022.07.20 |
php 정적 페이지 생성 및 미리 보기 (0) | 2022.07.20 |
php가 QR코드를 생성하여 앞 페이지로 돌아가기 (0) | 2022.07.20 |
PHP 환경 구축-Windows 시스템에서의 PHP 환경 구축 (0) | 2022.07.20 |