>백엔드 개발 >PHP 튜토리얼 >PHP의 몇 가지 차이점 설정 방법 및 성능 비교

PHP의 몇 가지 차이점 설정 방법 및 성능 비교

*文
*文원래의
2017-12-23 15:55:272431검색

프로그래밍에서는 주어진 두 배열의 차이를 구하는 등 항상 일부 데이터를 처리해야 합니다. 구현 방법은 많지만 차이 집합을 찾는 데 더 나은 성능을 보이는 방법은 무엇입니까? 오늘은 차이점 세트를 찾는 예와 코드 성능을 최적화하는 방법을 공유하겠습니다.

질문은 다음과 같습니다. 각각 5000개의 요소가 있는 두 개의 배열이 주어지고 그 차이 집합을 계산합니다. 직설적으로 말하면 PHP와 가장 좋다고 생각하는 알고리즘을 사용하여 array_diff 알고리즘을 구현하는 것입니다. 처음 이 질문을 받았을 때 아주 간단하다는 생각이 들어서 지난 경험을 바탕으로 '캐주얼'로 하나 작성해봤습니다.

 function array_diff($array_1, $array_2) { 
    $diff = array(); 
    foreach ($array_1 as $k => $v1) { 
        $flag = false; 
        foreach ($array_2 as $v2) { 
            if ($flag = ($v1 == $v2)) { 
                break; 
            } 
        } 
        if (!$flag) { 
            $diff[$k] = $v1; 
        } 
    } 
    return $diff; 
}

구현은 가능하지만 이 기능의 효율성이 형편없네요. . 그래서 알고리즘을 다시 생각하고 최적화했습니다. 두 번째 함수는 다음과 같습니다.

function array_diff($array_1, $array_2) { 
    foreach ($array_1 as $key => $item) { 
        if (in_array($item, $array_2, true)) { 
            unset($array_1[$key]); 
        } 
    } 
    return $array_1; 
}

음, 이번에는 원래 array_diff 함수만큼 빠릅니다. 하지만 더 최적화된 방법이 있을까요? ChinaUnix에 대한 기사(죄송합니다, 속였습니다)에서 저는 PHP가 실제로 다음과 같이 작성될 수 있다는 것을 발견했습니다:

function array_diff($array_1, $array_2) { 
    $array_2 = array_flip($array_2); 
    foreach ($array_1 as $key => $item) { 
        if (isset($array_2[$item])) { 
            unset($array_1[$key]); 
        } 
     } 
    return $array_1; 
}

이 함수의 효율성은 놀랍고 원래 array_diff 함수보다 훨씬 빠릅니다. 이유를 조사해 보니 다음과 같은 설명이 나왔습니다.


키가 HASH로 정리되어 있어서 검색 속도가 매우 빠릅니다.

값은 Key 구성에만 저장되며, 각 검색 자체는 순회되지 않습니다. 요약

이것은 PHP 언어의 작은 트릭이지만 배열 값을 순회하고 비교할 때 값을 비교해야 하는 경우 키를 사용하여 역순으로 하는 것이 실제로 일반적인 값 대 값 비교보다 훨씬 효율적입니다.


예를 들어 위의 함수 2는 in_array 함수를 호출해야 하며 함수 내에 있는지 확인하기 위해 반복해야 하며, 함수 3은 키가 배열에 존재하는지 여부만 확인합니다. 배열 키와 값의 다양한 조직적 인덱싱 방법과 결합하면 효율성이 상상 이상으로 높다는 것은 매우 이해할 수 있습니다.

<?php 
function microtime_float() { 
    list($usec, $sec) = explode(" ", microtime()); 
    return ((float)$usec + (float)$sec); 
} 
function array_diff2($array_1, $array_2) { 
    $diff = array(); 
    foreach ($array_1 as $k => $v1) { 
        $flag = false; 
        foreach ($array_2 as $v2) { 
            if ($flag = ($v1 == $v2)) { 
                break; 
            } 
        } 
        if (!$flag) { 
            $diff[$k] = $v1; 
        } 
    } 
    return $diff; 
} 
function array_diff3($array_1, $array_2) { 
    foreach ($array_1 as $key => $item) { 
        if (in_array($item, $array_2, true)) { 
            unset($array_1[$key]); 
        } 
    } 
    return $array_1; 
} 
function array_diff4($array_1, $array_2) { 
    $array_2 = array_flip($array_2); 
    foreach ($array_1 as $key => $item) { 
        if (isset($array_2[$item])) { 
            unset($array_1[$key]); 
        } 
     } 
    return $array_1; 
} 
////////////////////////////// 
for($i = 0, $ary_1 = array(); $i < 5000; $i++) { 
    $ary_1[] = rand(100, 999); 
} 
for($i = 0, $ary_2 = array(); $i < 5000; $i++) { 
    $ary_2[] = rand(100, 999); 
} 
header("Content-type: text/plain;charset=utf-8"); 
$time_start = microtime_float(); 
array_diff($ary_1, $ary_2); 
echo "函数 array_diff 运行" . (microtime_float() - $time_start) . " 秒\n"; 
$time_start = microtime_float(); 
array_diff2($ary_1, $ary_2); 
echo "函数 array_diff2 运行" . (microtime_float() - $time_start) . " 秒\n"; 
$time_start = microtime_float(); 
array_diff3($ary_1, $ary_2); 
echo "函数 array_diff3 运行" . (microtime_float() - $time_start) . " 秒\n"; 
$time_start = microtime_float(); 
array_diff4($ary_1, $ary_2); 
echo "函数 array_diff4 运行" . (microtime_float() - $time_start) . " 秒\n"; 
?>

PHP의 몇 가지 차이점 설정 방법 및 성능 비교


관련 권장 사항:

array_chunk()_PHP 없이 배열을 분할하는 PHP 알고리즘 튜토리얼

배열의 결합, 교차 및 차이 함수

요약 PHP 배열 정렬 방법

위 내용은 PHP의 몇 가지 차이점 설정 방법 및 성능 비교의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.