博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
yeild 理解
阅读量:5140 次
发布时间:2019-06-13

本文共 1136 字,大约阅读时间需要 3 分钟。

生成器yield关键字不是返回值,他的专业术语叫产出值,只是生成一个值

每次被加载到内存中的文字只有一行,大大的减小了内存的使用。这样,即使读取上G的文本也不用担心,完全可以像读取很小文件一样编写代码。

 百万级别的访问量

yield生成器是php5.5之后出现的,yield提供了一种更容易的方法来实现简单的迭代对象,相比较定义类实现 Iter

优点:

  • 生成器会对PHP应用的性能有非常大的影响
  • PHP代码运行时节省大量的内存
  • 比较适合计算大量的数据
 
function createRange($number) {    $data = [];
  for($i=0;$i<$number;$i++)   {     $data[] = time();   }     return $data; }
$result = createRange(10); // 这里调用上面我们创建的函数foreach($result as $value){    sleep(1);//这里停顿1秒,我们后续有用    echo $value.'
';}

输出的结果是10个一样的时间戳,sleep(1)效果看不出来

function createRange($number){    for($i=0;$i<$number;$i++){        yield time();    }}$result = createRange(10); // 这里调用上面我们创建的函数foreach($result as $value){    sleep(1);    echo $value.'
';}

输出的结果中间间隔了1秒

我们来还原一下代码执行过程。

  1. 首先调用 createRange 函数,传入参数10,但是 for 值执行了一次然后停止了,并且告诉 foreach 第一次循环可以用的值。
  2.  foreach 开始对 $result 循环,进来首先 sleep(1) ,然后开始使用 for 给的一个值执行输出。
  3.  foreach 准备第二次循环,开始第二次循环之前,它向 for 循环又请求了一次。
  4.  for 循环于是又执行了一次,将生成的时间戳告诉 foreach .
  5.  foreach 拿到第二个值,并且输出。由于 foreach 中 sleep(1) ,所以, for 循环延迟了1秒生成当前时间

所以,整个代码执行中,始终只有一个记录值参与循环,内存中也只有一条信息。

无论开始传入的 $number 有多大,由于并不会立即生成所有结果集,所以内存始终是一条循环的值。

转载于:https://www.cnblogs.com/hanmengya/p/10947835.html

你可能感兴趣的文章
oracle 创建暂时表
查看>>
201421410014蒋佳奇
查看>>
Xcode5和ObjC新特性
查看>>
LibSVM for Python 使用
查看>>
Centos 7.0 安装Mono 3.4 和 Jexus 5.6
查看>>
CSS属性值currentColor
查看>>
java可重入锁reentrantlock
查看>>
浅谈卷积神经网络及matlab实现
查看>>
解决ajax请求cors跨域问题
查看>>
《收获,不止Oracle》pdf
查看>>
LinkedList<E>源码分析
查看>>
Real-Time Rendering 笔记
查看>>
如何理解HTML结构的语义化
查看>>
Activity之间的跳转:
查看>>
实验四2
查看>>
Android现学现用第十一天
查看>>
多路复用
查看>>
Python数据可视化之Pygal(雷达图)
查看>>
Java学习笔记--字符串和文件IO
查看>>
转 Silverlight开发历程—(画刷与着色之线性渐变画刷)
查看>>