이 글을 쓰게 된 이유는 주로 개발 과정에서 갑자기 다음과 같은 질문이 생겨서 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 'for循环遍历耗时:'.$for_Time.'<br>'; }
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 'foreach循环遍历耗时:'.$foreach_Time; }
시간 계산 방법:
/** * 时间统计函数 */ private function microtime_float($time = null) { list($usec, $sec) = explode(' ', $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 중국어 웹사이트의 기타 관련 기사를 참조하세요!