현재 위치: > 최신 기사 목록> 큰 배열에서 Array_Diff ()의 성능

큰 배열에서 Array_Diff ()의 성능

M66 2025-05-17

php에서 array_diff ()는 둘 이상의 배열 값을 비교하고 첫 번째 배열에서 값을 반환하지만 다른 배열에서는 값을 반환하는 매우 일반적인 함수입니다. 이것은 데이터 필터링 및 차이점을 찾는 것과 같은 일일 개발에서 매우 편리합니다. 그러나 처리 된 데이터의 양이 커지면 Array_Diff ()는 어떻게 수행됩니까?

1. Array_Diff () 작동 방식

먼저 Array_Diff ()가 어떻게 작동하는지 빨리 이해해 봅시다.

 $result = array_diff($array1, $array2);

이 함수는 각 $ array1 의 각 값을 반복 한 다음 각 값의 $ array2 와 비교합니다. 기본값은 비 강력한 비교를 사용하는 것입니다 (예 : == 대신 aude == ). 즉, Array_Diff ()가 호출 될 때마다 PHP는 중첩 루프 작업을 수행해야하며 O (N * M)의 성능 복잡성은 $ array1 의 길이이고 M은 $ array2 의 길이입니다.

2. 성능 테스트

간단한 테스트를 통해 경험합시다.

 <?php
$array1 = range(1, 100000);
$array2 = range(50000, 150000);

$start = microtime(true);
$result = array_diff($array1, $array2);
$end = microtime(true);

echo "차이의 수: " . count($result) . PHP_EOL;
echo "실행 시간: " . ($end - $start) . " 두번째" . PHP_EOL;
?>

이 코드에서는 100,000 개 이상의 요소를 포함하는 두 개의 배열을 비교합니다. 이 스크립트를 실행하면 서버 성능에 따라 실행 시간이 초 사이 일 수 있습니다.

3. 최적화 제안

Array_diff ()는 작은 배열에 대해 잘 작동하지만 수백만 또는 더 많은 요소를 직면 할 때 성능이 급격히 떨어집니다. 대형 배열을 실제로 처리 해야하는 경우 다음은 다음과 같습니다.

해시 테이블을 사용하여 효율성을 향상시킵니다

 <?php
$array1 = range(1, 1000000);
$array2 = array_flip(range(500000, 1500000)); // 키를 사용하여 검색 효율성을 향상시킵니다

$start = microtime(true);

$result = [];
foreach ($array1 as $value) {
    if (!isset($array2[$value])) {
        $result[] = $value;
    }
}

$end = microtime(true);

echo "차이의 수: " . count($result) . PHP_EOL;
echo "실행 시간: " . ($end - $start) . " 두번째" . PHP_EOL;
?>

ISSET () 조작의 복잡성이 O (1)이므로 불필요한 중첩 루프를 크게 줄이기 때문에 이러한 방식으로 O (N)에 대한 복잡성을 줄일 수 있습니다.

4. 실제 응용 시나리오의 예

예를 들어, 사용자가 업로드 한 데이터에서 등록되지 않은 사서함 목록을 필터링해야합니다.

 <?php
$uploadedEmails = file('https://m66.net/uploads/email_list.txt', FILE_IGNORE_NEW_LINES);
$registeredEmails = getRegisteredEmailsFromDatabase(); // 배열을 반환합니다

$unregistered = array_diff($uploadedEmails, $registeredEmails);

foreach ($unregistered as $email) {
    echo "등록되지 않았습니다: $email" . PHP_EOL;
}
?>

이 예에서 업로드 된 파일에 수십만 또는 수백만 개의 이메일 주소가 포함 된 경우 Array_Diff ()를 사용하여 직접 성능 병목 현상이 될 수 있습니다.

결론적으로

Array_Diff ()는 사용하기 쉽고 명확한 의미를 가지고 있지만 큰 배열을 다룰 때 성능이 이상적이지 않습니다. 막대한 데이터 볼륨의 경우, 더 나은 실행 효율성을 달성 할 수있는보다 기본적인 방법 (예 : 해시 테이블 구축)을 사용하여 차동 세트 작업을 수동으로 구현하는 것이 좋습니다.

일반적으로 작은 데이터 볼륨에 Array_Diff ()를 사용하는 것이 매우 편리하지만 대규모 데이터 볼륨을 수동으로 최적화하는 것이 더 신뢰할 수 있습니다.