学科分类
目录
PHP基础

Generator生成器

Generator生成器提供了一种更容易的方法来实现简单的对象迭代,Generator类实现了Iterator接口,并且实现了Iterator的方法。相比于定义类实现Iterator接口的方式,性能开销和复杂性大大降低。

当遍历的数据量比较大时,使用Generator生成器可以节省内存开销,生成器是暂停循环执行逻辑,需要调用时才触发执行循环,yield关键字代表暂停代码继续向下执行。

接下来对比普通遍历和使用生成器遍历所占用的内存。使用普通方法进行遍历数组,具体代码如下所示。

 1  function getArray()
 2  {
 3    for ($i = 0; $i < 10000; $i++) {
 4      $arr[] = $i;
 5    }
 6    return $arr;
 7  }
 8  $arr = getArray();
 9  foreach ($arr as $v) {
 10   echo $v;
 11 }
 12 echo memory_get_usage();  // 919928

上述代码中,使用普通遍历方式先定义包含1000个元素的数组,然后通过foreach进行遍历输出,通过memory_get_usage()函数来获取程序运行所占用的内存。从输出结果可以得出大约是919928个字节。

使用生成器遍历数组,具体代码如下。

1  function getArray(){
2    for($i = 0; $i < 10000; $i++){
3      yield $i;
4    }
5    return $arr;
6  }
7  $arr = getArray();
8  var_dump($arr);       // 输出结果 object(Generator)#1(0){}
9  foreach ($arr as $v) {
10   echo $v;
11 }
12 echo memory_get_usage();  // 392400

上述代码中,使用生成器遍历数组,通过调用getArray()函数会返回Generator对象,程序的运行所占用的内存不到普通遍历方式的二分之一,节省了内存的消耗。

点击此处
隐藏目录