PHP性能优化利器:生成器 yield有哪些优点?

2020-09-1320:17:33后端程序开发Comments1,546 views字数 932阅读模式

生成器有哪些优点,如下:

  • 生成器会对PHP应用的性能有非常大的影响
  • PHP代码运行时节省大量的内存
  • 比较适合计算大量的数据

概念引入

首先,放下生成器概念的包袱,来看一个简单的PHP函数:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/20243.html

function rangeNum($num){
    $data = [];
    for($i=0;$i<$num;$i++){
        $data[] = time();
    }
    return $data;
}
复制代码

这是一个非常简单的PHP函数,我们在处理一些数组逻辑的时候经常会使用。这里的代码也非常简单。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/20243.html

下面我们再写一个函数去取出$data中的数据文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/20243.html

$data = rangeNum(10);
foreach($data as $value){
    sleep(1);
    echo $value.'<br />';
}
复制代码

这里非常完美,没有任何问题。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/20243.html

思考:

我们在调用函数时传递1000w或者更多的时候,那么调用函数的时候for循环1000w次$data里面的1000w条数据都是存储在内存当中的,在调用函数时候会占用大量内存文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/20243.html

创建生成器

我们直接修改函数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/20243.html

function rangeNum($num){
    for($i=0;$i<$num;$i++){
        yield time();
    }
}
复制代码

使用生成器

$data = rangeNum(10);
foreach($data as $value){
    sleep(1);
    echo $value.'<br />';
}
复制代码

到这里,你应该对生成器有点儿头绪。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/20243.html

概念理解

首先明确一个概念:生成器yield关键字不是返回值,他的专业术语叫产出值,只是生成一个值文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/20243.html

实际开发应用

读取超大文件

PHP开发很多时候都要读取大文件,比如csv文件、excel文件,或者一些log文件。这些文件如果很大很大,比如20个G。这时,直接一次性把所有的内容读取到内存中进行处理不太现实。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/20243.html

百万级别的访问量

yield生成器是php5.5之后出现的,yield提供了一种更简单的方法来实现简单的迭代对象,相较于类实现 Iterator 接口的方式,性能开销和复杂性大大降低。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/20243.html

作者:abel_xudong
链接:https://juejin.im/post/6850037263268511751
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/20243.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/20243.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/20243.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定