Home  >  Article  >  Backend Development  >  Which is more efficient, for or foreach? Why?

Which is more efficient, for or foreach? Why?

藏色散人
藏色散人forward
2020-06-13 14:57:385653browse

The reason for writing this article is mainly because I suddenly had the following questions during the development process. I took the time to explore them in depth to deepen my understanding of PHP.

1. As a PHPer, for and foreach loop traversals are used almost every day. So which of these two traversal methods is more efficient?

2. What is the reason for high efficiency?

3. What are the principles?

First of all, we need to solve the first problem. We can take a look at the test results through a simple test. The test code is as follows:

for loop traversal method:

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 loop traversal method:

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;
}

Time calculation method:

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

Look at the time consumption of the two methods

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

From the above We can clearly draw two conclusions from the test:

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

Then the second question: What is the reason for high efficiency? Before looking for this answer, let's discuss the third question first. Let's take a look at what the principles are.

for loop:

Every time it starts from $i, each loop needs to determine whether $i is less than count, which takes up a lot of time

Less than continue, otherwise terminate the loop

foreach:

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

BUT: Is this really the case? Some people would say that this example is already very obvious, and the conclusion is clear at a glance. Are there other possibilities?

I think the truth is not that simple. If this is really the case, what is the meaning of the for loop?

Since foreach is so many times more efficient than for, wouldn’t it be enough to just use foreach? Personally, I feel that the example I tested has certain limitations and cannot be used as an absolute basis for evaluating the efficiency of the two loop methods.

However, for our PHPers, it is better to use foreach loop traversal in normal work. As for how the compilation layer works, there is no need to go into too much detail. If you are interested, you can study it in depth.

The following is the reply from netizens:

The meaning of for exists because there are some situations where foreach is difficult to implement. For specific details, you can take a look at Article 46 of Effective Java. Although you are doing PHP, they are basically the same! The book recommends using the foreach mode, but there are three situations where it is inappropriate: 1. Filtering - If you need to traverse the collection and remove selected elements, you must use explicit iteration and call its remove method. 2. Conversion - If you need to iterate over a list or array and replace some or all of the element values, you will need the iterator of the list or the index of the array to set these values. 3. Parallel iteration - If you need to traverse multiple collections in parallel, you need to explicitly control the iterator or index variable so that all iterators or indexes can advance cooperatively. Then for and foreach seem to traverse different data in terms of performance. There are different performance differences, such as linked lists or arrays. This is something I have been wondering about recently.

Related recommendations: "PHP Tutorial"

The above is the detailed content of Which is more efficient, for or foreach? Why?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:csdn.net. If there is any infringement, please contact admin@php.cn delete