일반적으로 배열을 순회하는 방법에는 for, while, foreach의 세 가지 방법이 있습니다. 그 중 가장 간단하고 편리한 것은 foreach입니다. 그렇다면 이들 간의 작동 및 성능 차이는 무엇입니까? 일반적으로 어떤 방법을 사용하는 것이 더 낫습니까?
먼저 50,000개의 첨자가 있는 1차원 배열을 탐색하는 데 걸리는 시간을 테스트해 보겠습니다.
테스트 플랫폼:
CPU: PM725
메모리: 512M
하드 드라이브: 40G 5400rpm
운영체제: 윈도우 XP SP2
웹: 아파치 2.0.54 php5.0.4
테스트 코드:
<?php
/*
* @ 작가 : 릴로프
* @ 홈페이지 : www.codesky.com
* @ 이메일 : [email protected]
*
*/
$arr = 배열();
for($i = 0; $i < 50000; $i++){
$arr[] = $i*rand(1000,9999);
}
함수 GetRunTime()
{
list($usec,$sec)=explode(" ",microtime());
return ((float)$usec+(float)$sec);
}
##################################
$time_start = GetRunTime();
for($i = 0; $i < count($arr); $i++){
$str .= $arr[$i];
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo '사용된 시간:'.round($time_used, 7).'(s)<br><br>';
unset($str, $time_start, $time_end, $time_used);
##################################
$time_start = GetRunTime();
while(list($key, $val) = 각각($arr)){
$str .= $val;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo '사용된 시간:'.round($time_used, 7).'(s)<br><br>';
unset($str, $key, $val, $time_start, $time_end, $time_used);
##################################
$time_start = GetRunTime();
foreach($arr as $key => $val){
$str .= $val;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo 'foreach 사용 시간:'.round($time_used, 7).'(s)<br><br>';
###################################
?>
테스트 결과:
세 가지 테스트 결과의 평균을 냅니다.
각각 for, while, foreach에 해당합니다.
0.1311650
0.1666853
0.1237440
테스트를 반복한 결과 동일한 배열을 순회하는 경우 foreach가 가장 빠르고 while이 가장 느린 것으로 나타났습니다. foreach는 while보다 약 20% ~ 30% 빠릅니다. 그런 다음 배열 첨자를 500000과 5000000으로 늘리면 테스트 결과는 동일합니다. 그러나 원칙적인 관점에서 보면 foreach는 배열 복사본에서 작동하는 반면 while은 배열의 내부 인덱스를 이동하여 작동합니다. 일반적으로 foreach보다 while이 더 빠르다고 생각됩니다. foreach는 먼저 배열을 복사하고 while은 내부 포인터를 직접 이동하지만 결과는 정반대입니다. 그 이유는 foreach는 PHP의 내부 구현인 반면 while은 일반적인 루프 구조이기 때문입니다.
따라서 일반 애플리케이션에서는 간단하고 효율적인 foreach 형식을 사용하는 것을 선호합니다. PHP5에서는 foreach가 클래스 속성을 순회할 수도 있습니다.