zoukankan      html  css  js  c++  java
  • 简单了解一下php的迭代生成器yield

    yield是从PHP5.5开始有的,关于yidle的说明鸟哥的博客做了详细说明,我觉得是有点复杂,在看了几篇其他的帖子还有案例,我大概知道yield的作用就是在做大量数据循环处理的时候,能节省很大一部分内存~

    官方:http://php.net/manual/zh/language.generators.syntax.php

    鸟哥:http://www.laruence.com/2015/05/28/3038.html

    参考案例说明yield的作用

    <?php
     //普通模式的代码
    function generateData($max)
    {
     $arr = [];
     for ($i = 0; $i <= $max; $i++) {
     $arr[] = $i;
     }
    }
     
    echo '开始前内存占用:' . memory_get_usage() . PHP_EOL;
    $data = generateData(100000);
    echo '生成完数组后内存占用:' . memory_get_usage() . PHP_EOL;
    unset($data);
    echo '释放后的内存占用:' . memory_get_usage() . PHP_EOL;
    # php yield.php 
    开始前内存占用:387600
    生成完数组后内存占用:387632
    释放后的内存占用:387632

    前后使用的内存差值为:387632-387600 = 32

    # php yield.php 
    开始前内存占用:386912
    生成完数组后内存占用:387520
    释放后的内存占用:386944

    前后使用的内存差值为:387520-386912 = 608

    明显608要远远大于32,不是说是降低内存使用率么。那么就把循环的数值调大试试。把100000改为10000000

    再使用cli模式执行,发现不适用yield会报错了

    PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 134217736 bytes) in /data/wwwroot/default/up_sql.php on line 7

    但是yield依然是608,这是因为它自身,它在你进行迭代的时候才会产生真实数据。

    所以如果你的数据来源非常大,那么用 yield 吧。如果数据来源很小,当然选择一次载入内存。

  • 相关阅读:
    从spring官网下载spring 架包
    bootstrap-dialog插件的使用
    underscore.js,js工具库
    datatables,表格
    formvalidation表单验证
    数字千分位处理,number.js,js保留两位,整数强制保留两位小数
    js精确计算
    django F和Q 关键字使用
    django 的多对多关系
    django中的一对一的关系
  • 原文地址:https://www.cnblogs.com/wt645631686/p/9269836.html
Copyright © 2011-2022 走看看