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对象,程序的运行所占用的内存不到普通遍历方式的二分之一,节省了内存的消耗。