이 기사에서는 세 가지 PHP 배열 병합 방법인 array_merge, array_push 및 요소 추가 방법을 공유하고 성능과 메모리 소비를 비교합니다.
PHP에서 배열 병합을 구현하려면 일반적으로 사용되는 두 가지 방법이 있습니다.
⒈ 코드 구현
/** 用 PHP 实现将一个二维数组合并为一个一维数组 */ // 数组的长度 $len = $argv[1]; $start = 0; $arr = []; // 数组初始化 while ($start < $len) { $arr[$start] = range(1, $len); $start ++; } // 采用 array_merge 的方式合并数组 function merge1 (array $input) { $results = []; foreach ($input as $item) { $results = array_merge($results, $item); } return $results; } // 采用 array_push 的方式合并数组 function merge2 (array $input) { $results = []; foreach ($input as $item) { foreach ($item as $v) { array_push($results, $v); } } return $results; } // 采用元素追加的方式合并数组 function merge3(array $input) { $results = []; foreach ($input as $item) { foreach ($item as $v) { $results [] = $v; } } return $results; } echo microtime(), PHP_EOL; $res = merge3($arr); echo microtime(), PHP_EOL; echo memory_get_usage(), PHP_EOL; echo memory_get_peak_usage(), PHP_EOL;
⒉ 실행 결과 비교
배열 길이 | array_merge | array_push | 요소 추가 | |||
메모리 소비(B) | 실행 시간(㎲) | 메모리 소비(B) | 실행 시간(㎲) | 메모리 소비(B) | 실행 시간(㎲) | |
5 | 432,440 | 20 | 433, 200 | 25 | 433,200 | 19 |
50 | 764,704 | 322 | 629,736 | 141 | 629,736 | 102 |
500 | 27,434,944 | 897,422 | 19,042,416 | 11,294 | 19,042,416 | 8,182 |
5,000 | 3,479,599,136 | 904,476,129 | 2,405,853,392 | 1,266,203 | 2,405 ,853 ,392 | 1,022,328 |
⒊ 이유 분석
array_merge 사용 code>, 호출될 때마다 <code>array_merge
의 결과 배열을 위해 새로운 메모리 공간을 할당해야 합니다. (PHP는 쓰기 시 복사 메커니즘을 사용하고 array_merge
는 매개변수를 쓰지 않으므로 호출될 때마다 입력 매개변수에 대한 메모리를 재할당할 필요가 없습니다. 배열의 길이가 늘어남에 따라 array_merge
호출 횟수도 늘어나고, 동시에 결과 배열의 길이도 늘어납니다. , 그리고 매번 할당해야 하는 메모리 공간도 늘어나게 되므로 메모리를 많이 소모하게 됩니다. 동시에, 빈번한 메모리 할당/파괴로 인해 PHP 성능이 저하됩니다. array_merge
,每调用一次,都需要为 array_merge
的结果数组分配新的内存空间(PHP 采用的是写时复制的机制,而 array_merge
不会对参数进行写操作,所以每次调用时并不需要为入参重新分配内存)。随着数组长度的增加,调用 array_merge
的次数也会增加,重新分配内存的次数也会增加,同时结果数组的长度不断增加,每次所需要分配的内存空间也会随着增加,这就需要消耗大量的内存。同时,频繁的分配/销毁内存,导致 PHP 的性能下降。
使用 array_push
,只需要对结果数组分配一次内存,之后会一直往结果数组中追加元素。PHP 数组的底层实现方式为 hashtable
,并且在初始化时会为 hashtable
分配 8 个长度的 bucket
,每个 bucket
存储一个数组元素。当现有的 bucket
用完之后,如果还要继续往数组中追加元素,那么 PHP 会将现有的 bucket
数量翻倍,所以,使用 array_push
往结果数组中追加元素时,并不是每次操作都需要分配新的 bucket
,这样就减少了分配内存的次数,同时加快了程序运行时间,提升了 PHP 性能。
使用元素追加的方式,原理与 array_push
类似,唯一的区别在于使用 array_push
array_push
를 사용하면 결과 배열에 메모리를 한 번만 할당하면 요소가 결과 배열에 추가됩니다. PHP 배열의 기본 구현은 해시테이블
이며, 초기화 중에 해시테이블
에는 8개 길이의 버킷
이 할당됩니다. 각 버킷
code> 배열 요소를 저장합니다. 기존 버킷
을 모두 사용한 경우 배열에 요소를 계속 추가하면 PHP는 기존 버킷
수를 두 배로 늘리므로 array_push
를 사용하세요. > 결과 배열에 요소를 추가할 때 모든 작업에서 새 버킷
을 할당할 필요는 없습니다. 이를 통해 메모리 할당 수가 줄어들고 프로그램 실행 시간이 빨라지며 PHP 성능이 향상됩니다. 요소를 추가하는 원리는 array_push
와 유사합니다. 유일한 차이점은 array_push
를 사용할 때 함수 호출이 있지만 요소를 추가하는 방법은 그렇지 않다는 것입니다. 함수 호출이 필요합니다. 이렇게 하면 프로그램이 더 가볍게 실행됩니다. 🎜🎜🎜🎜추천 학습: "🎜PHP 비디오 튜토리얼🎜"🎜위 내용은 PHP 배열 병합 방법: array_merge VS array_push VS 요소 추가의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!