>  기사  >  백엔드 개발  >  PHP 배열 병합 방법: array_merge VS array_push VS 요소 추가

PHP 배열 병합 방법: array_merge VS array_push VS 요소 추가

青灯夜游
青灯夜游앞으로
2021-07-07 19:13:133683검색

이 기사에서는 세 가지 PHP 배열 병합 방법인 array_merge, array_push 및 요소 추가 방법을 공유하고 성능과 메모리 소비를 비교합니다.

PHP 배열 병합 방법: array_merge VS array_push VS 요소 추가

PHP에서 배열 병합을 구현하려면 일반적으로 사용되는 두 가지 방법이 있습니다.

  • array_merge를 직접 사용하면 코드가 간결해지지만 메모리 오버헤드가 크게 증가하고 프로세스 속도가 느려집니다.
  • 배열을 탐색하고 배열의 값을 결과 배열에 하나씩 추가합니다. array_merge를 직접 사용하는 것과 비교하면 이 방법은 코드 양이 늘어나지만 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제