php 新特性之yield大數組處理優化

場景: 處理大數組的時候,好比循環更新數據或者導出訂單數據到excel文件,普通方式可能會引發"Allowed memory size of  XXXXX bytes exhausted" 錯誤,而yield方式能夠節省不少內存,就不會有這個問題啦!!!php

代碼環境: MacOs / php7.1.3 / 8G ram數組

<?php
/**
 * Created by PhpStorm.
 * User: lf
 * Date: 2017/3/30
 * Time: 15:55
 */


$t1 = microtime(true);

//common 方式

class common_data
{


    function data()
    {
        $array = [];
        for ($i = 1; $i <= 1000000; $i++) {
            $array[] = 'item_' . $i;
        }
        return $array;
    }


    function callback($param)
    {
//        echo $param;

        return $param;

    }

}


//yield 方式


class  yield_data
{
    function data()
    {
        for ($i = 1; $i <= 1000000; $i++) {
            $array = 'item_' . $i;
            yield $array;
        }
    }

    function callback($param)
    {
//        echo $param;
        return $param;

    }
}
//$commn = new common_data();
//$data= $commn->data();
//foreach ($data as $value) {
//    $commn->callback($value);
//}


$yield = new yield_data();
$data = $yield->data();
foreach ($data as $value) {
    $yield->callback($value);
}


$t2 = microtime(true);
echo '耗時' . round($t2 - $t1, 7) . '秒<br>';
echo '內存: ' . memory_get_usage() / 1024 . 'K<br />';

結果:php7

yield 方式  :測試

耗時0.184339秒
內存: 349.984375Kexcel

common 方式:code

耗時0.1598852秒
內存: 72183.375K 72MB!!!!orm

可見二者之間的內存佔用差距是至關的大啊!!內存

同時,yield方式相對會耗時一丟丟,但差距不是很大.不知道在低版本的php裏運行會是什麼結果,你們能夠拿代碼去進行測試.🙃get

相關文章
相關標籤/搜索