Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP에서 for 루프 vs foreach 루프, 성능 차이 완벽 비교

PHP에서 for 루프와 foreach 루프의 성능 비교

PHP에서 배열을 순회할 때 흔히 사용하는 foreach는 일반적인 for 루프에 비해 속도가 느린 것으로 알려져 있습니다. 그 이유는 foreach가 반복을 수행하기 전에 해당 배열을 복사(copy)하기 때문입니다. 배열의 크기가 클수록 이 복사 과정에서 발생하는 오버헤드가 커져 성능 저하로 이어집니다.

따라서 성능을 개선하려면 참조(reference) 개념을 활용하는 것이 효과적입니다. 참조(&)를 사용하면 원본 배열을 직접 조작하게 되어 복사 과정이 생략되고, 실행 속도가 눈에 띄게 향상됩니다. 물론 foreach는 문법이 간결하고 사용하기 매우 편리하다는 장점이 있기 때문에, 상황에 따라 가독성과 성능 사이의 균형을 고려하여 선택하는 것이 좋습니다.

예제 코드

다음은 네 가지 방식으로 동일한 배열을 순회하며 각각의 소요 시간을 측정하는 간단한 예제입니다.

<?php
   $my_arr = array();
   for ($i = 0; $i < 10000; $i++) {
      $my_arr[] = $i;
   }
   $start = microtime(true);
   foreach ($my_arr as $k => $v) {
      $my_arr[$k] = $v + 1;
   }
   echo "This completed in ", microtime(true) - $start, " seconds";
   echo "<br>";
   $start = microtime(true);
   foreach ($my_arr as $k => &$v) {
      $v = $v + 1;
   }
   echo "This completed in ", microtime(true) - $start, " seconds";
   echo "<br>";
   $start = microtime(true);
   foreach ($my_arr as $k => $v) {}
   echo "This completed in ", microtime(true) - $start, " seconds";
   echo "<br>";
   $start = microtime(true);
   foreach ($my_arr as $k => &$v) {}
   echo "This completed in ", microtime(true) - $start, " seconds";
?>

위 코드는 다음 네 가지 경우를 비교합니다.

  • 값(value) 방식으로 순회하며 수정: 배열 요소를 복사한 후 인덱스로 다시 접근해 값을 변경합니다.
  • 참조(&) 방식으로 순회하며 수정: 원본 값에 직접 접근하여 값을 변경합니다.
  • 값 방식으로 단순 순회만 수행: 아무 작업 없이 배열만 복사하여 순회합니다.
  • 참조 방식으로 단순 순회만 수행: 복사 없이 원본을 직접 순회합니다.

실행 결과

위 코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.

This completed in 0.00058293342590332 seconds
This completed in 0.00063300132751465 seconds
This completed in 0.00023412704467773 seconds
This completed in 0.00026583671569824 seconds

결과 분석

측정 결과를 보면 몇 가지 중요한 사실을 확인할 수 있습니다. 먼저, 단순 순회(수정 없이 읽기만 하는 경우)는 값을 수정하는 경우보다 약 2배 이상 빠릅니다. 또한 참조를 사용한 순회가 값 복사 방식보다 더 나은 성능을 보이는데, 이는 배열 복사 오버헤드가 제거되었기 때문입니다.

다만 주의할 점도 있습니다. 참조를 사용한 foreach 루프가 끝난 후에는 마지막 요소를 가리키는 참조 변수가 남아있으므로, 루프 종료 후 unset($v)를 호출하여 참조를 해제하는 것이 안전합니다. 결론적으로 대용량 배열을 다루거나 성능이 중요한 작업에서는 참조 기반의 foreach 또는 for 루프를 활용하고, 일반적인 경우에는 가독성이 좋은 foreach를 사용하는 것이 바람직합니다.