>  기사  >  백엔드 개발  >  for와 foreach 중 어느 것이 더 효율적인가요? 왜?

for와 foreach 중 어느 것이 더 효율적인가요? 왜?

藏色散人
藏色散人앞으로
2020-06-13 14:57:385512검색

이 글을 쓰게 된 이유는 주로 개발 과정에서 갑자기 다음과 같은 질문이 생겨서 PHP에 대한 이해를 깊게 하기 위해 깊이 있게 탐구하는 시간을 가졌기 때문입니다.

1. phper에서는 for 및 foreach 루프 순회가 거의 매일 사용되는데, 이 두 가지 순회 방법 중 어느 것이 더 효율적인가요?

2. 효율이 높은 이유는 무엇인가요?

3. 원칙은 무엇인가요?

먼저 첫 번째 문제를 해결해야 합니다. 간단한 테스트를 통해 테스트 결과를 살펴보겠습니다.

for 루프 탐색 방법:

public function getForTime(){
    $big_Array = range(0,1000000,1);
     /* for循环遍历数组示例 */
    $start_For_Time = $this->microtime_float();
    //$array_Count = count($big_Array);
    for ($i=0;$i<count($big_Array);$i++) {
            $i;
    }
    $end_For_Time = $this->microtime_float();
    $for_Time = $end_For_Time - $start_For_Time;
    echo &#39;for循环遍历耗时:&#39;.$for_Time.&#39;<br>&#39;;
}

foreach 루프 순회 방법:

public function getForeachTime(){
$big_Array = range(0,1000000,1);
 /* foreach循环遍历数组示例 */
    $start_Foreach_Time = $this->microtime_float();
    foreach ($big_Array as $key=>$val) {
            $key;
    }
    $end_Foreach_Time = $this->microtime_float();
    $foreach_Time = $end_Foreach_Time - $start_Foreach_Time;
    echo &#39;foreach循环遍历耗时:&#39;.$foreach_Time;
}

시간 계산 방법:

/**
 *  时间统计函数
 */
private function microtime_float($time = null)
{
   list($usec, $sec) = explode(&#39; &#39;, $time ? $time : microtime());
   return ((float)$usec + (float)$sec);
}

두 가지 방법의 시간 소모를 살펴보세요.

/*
 * 输出结果:第一种情况:先count在for循环遍历耗时:0.028002023696899 秒
 *                         foreach循环遍历耗时:0.003000020980835 秒
 *        第二种情况:在for循环条件中做count遍历耗时:0.095005035400391 秒
 *                            foreach循环遍历耗时:0.0040009021759033 秒
 * */

위 테스트에서 우리는 분명히 두 가지 결론을 도출할 수 있습니다:

1、for循环遍历的效率是低于foreach循环遍历
2、for循环在外部做count和在条件中做count相比较,第一种效率更高

그럼 두 번째 질문: 이유는 무엇입니까? 고효율을 위해? 이 답변을 찾기 전에 먼저 세 번째 질문에 대해 논의해 보겠습니다. 원칙이 무엇인지 살펴보겠습니다.

for 루프:

$i에서 시작할 때마다 각 루프는 $i가 count보다 작은지 확인해야 하며, 이는 많은 시간이 걸립니다

count보다 작으면 계속하고 그렇지 않으면 루프가 종료되었습니다

foreach:

foreach 依赖 IEnumerable.
第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a,
以后每次再执行 var a in GetList() 的时候 调用 MoveNext.直到循环结束.
期间GetList()方法只执行一次.
从上面是分析我们明显可以得出结论:php 的foreach循环效率是大大高于for循环。

BUT: 이것이 정말 사실인가요? 어떤 사람들은 이 예가 이미 매우 명백하고 결론이 한눈에 분명하다고 말할 것입니다. 다른 가능성이 있습니까?

진실은 그렇게 간단하지 않다고 생각합니다. 만약 이것이 사실이라면 for 루프의 의미는 무엇입니까?

foreach는 for보다 몇 배 더 효율적이므로 foreach만 사용하면 충분하지 않나요? 개인적으로 제가 테스트한 예제에는 특정 제한 사항이 있으며 두 루프 방법의 효율성을 평가하는 절대적인 기준으로 사용할 수 없다고 생각합니다.

그러나 우리 PHP 사용자의 경우 일반적인 작업에서는 foreach 루프 순회를 사용하는 것이 더 좋습니다. 컴파일 계층의 작동 방식에 대해서는 너무 자세히 설명할 필요가 없습니다. 관심이 있다면 깊이 연구할 수 있습니다. .

다음은 한 네티즌의 답변입니다.

foreach를 구현하기 어려운 상황이 있기 때문에 for의 의미가 존재합니다. 자세한 내용은 Effective Java 조항 46을 참조하세요. PHP로 작업하면 기본적으로 서로 연결되어 있죠? 책에서는 foreach 모드 사용을 권장하지만 이 모드가 부적절한 세 가지 상황이 있습니다. 1. 필터링 - 컬렉션을 순회하고 선택한 요소를 제거해야 하는 경우 명시적 반복을 사용하고 해당 제거 메서드를 호출해야 합니다. 2. 변환 - 목록이나 배열을 반복하고 요소 값의 일부 또는 전부를 바꿔야 하는 경우 이러한 값을 설정하려면 목록의 반복자 또는 배열의 인덱스가 필요합니다. 3. 병렬 반복 - 여러 컬렉션을 병렬로 순회해야 하는 경우 모든 반복자 또는 인덱스가 함께 진행될 수 있도록 반복자 또는 인덱스 변수를 명시적으로 제어해야 합니다. 그런 다음 for 및 foreach는 성능 측면에서 서로 다른 데이터를 순회하는 것처럼 보입니다. 연결리스트나 배열 등 성능 차이가 있다는 게 최근 궁금했던 부분입니다.

관련 추천: "PHP 튜토리얼"

위 내용은 for와 foreach 중 어느 것이 더 효율적인가요? 왜?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제