일반적으로 배열을 순회하는 방법에는 for, while, foreach 세 가지가 있습니다. 그 중 가장 간단하고 편리한 것은 foreach입니다. 그렇다면 이들 간의 작동 및 성능 차이는 무엇입니까? 일반적으로 어떤 방법을 사용하는 것이 더 낫습니까?
먼저 첨자가 50,000개인 1차원 배열을 순회하는 데 걸리는 시간을 테스트해 보겠습니다.
테스트 플랫폼:
CPU: P-M 725
메모리: 512M
하드 디스크: 40G 5400rpm
OS: Windows XP SP2
WEB: apache 2.0.54 php5.0.4
테스트 코드:
$arr = array();
for($i = 0; $i < 50000; $i ){
$arr[] = $i*rand(1000,9999);
}
function 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 )
';
설정 해제($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)
';
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)
###############################
는 각각 for, while, foreach에 해당
0.13116500.1666853
0.1237440
반복 후 테스트 결과에 따르면 동일한 배열을 순회하는 경우 foreach가 가장 빠르고 가장 느린 것은 while입니다. foreach는 while보다 약 20% ~ 30% 빠릅니다. 그런 다음 배열 첨자를 500000과 5000000으로 늘리면 테스트 결과는 동일합니다. 그러나 원칙적인 관점에서 보면 foreach는 배열 복사본에서 작동하는 반면 while은 배열의 내부 인덱스를 이동하여 작동합니다. 일반적으로 foreach보다 while이 더 빠르다고 생각됩니다. foreach는 먼저 배열을 복사하고 while은 내부 포인터를 직접 이동하지만 결과는 정반대입니다. 그 이유는 foreach는 PHP의 내부 구현인 반면 while은 일반적인 루프 구조이기 때문입니다.
그래서 일반 애플리케이션에서는 간단하고 효율적인 foreach 형식을 사용하는 것을 선호합니다. PHP5에서는 foreach가 클래스 속성을 탐색할 수도 있습니다.