前言

最近工作有点忙,好不容易抽空更下博客。

yield是php5.5新出来的一个关键字,它可以让你无需将一个生成的数组赋值后操作,而是仅返回一个数组元素并将指针next,这样可以很大程度上节省你的内存。

性能测试

那么yield的性能到底如何呢?由于项目中有用到这个关键字,所以这里测试了一下,测试环境apache+php5.5.12,本机windows环境。

先来看普通的方法:

普通模式

// 需要测试的核心函数
function test()
{
    $array = array();
    for($i = 0; $i < 10000; $i++){
        $array[] = 'item_' . $i;
    }
    return $array;
}

// 测试代码
$test = test();
foreach($test as $v){
    doSomething($v);
//    var_dump($v);
}

// 这仅仅是一个测试函数,你需要做点什么?
function doSomething($v)
{
    return $v;
}

测试结果如下:

cost time: 0.38202214241028 s
cost memory: 1079.171875 kb

yield

然后是yield的:

function test()
{
    for($i = 0; $i < 10000; $i++){
        $array = 'item_' . $i;
        yield $array;
    }
}

$test = test();
foreach($test as $v){
    doSomething($v);
//    var_dump($v);
}

function doSomething($v)
{
    return $v;
}

测试结果如下:

cost time: 0.76404404640198 s  
cost memory: 0.359375 kb

可以看出来,内存占用减少了不止一点点,但执行时间多了将近一半。

纯属意外

无意中将

$test = test();
foreach($test as $v){
    doSomething($v);
//    var_dump($v);
}
```bash

改成了
```php
foreach(test() as $v){
    doSomething($v);
//    var_dump($v);
}

发现测试结果变成了: cost time: 0.39502310752869 s
cost memory: 0.1875 kb

在刷新页面看到结果的瞬间,以为发现了一个惊天的秘密,居然直接foreach函数会占内存这么少,比yield还少,时间也比yield少。但马上发现错了,foreach $test后没有对$test进行unset,所以最终测试内存会比较高,foreach函数并没有对函数结果赋值,当然最后内存占用会少很多!

这个时候发现必须加入一个峰值内存,于是重新测试得出的结果如下:

普通方式:

cost time: 0.39402294158936 s 
cost memory: 1079.171875 kb 
peak memory: 1280 kb

自己挖的小坑,foreach函数的普通方式:

cost time: 0.38102197647095 s 
cost memory: 0.1875 kb 
peak memory: 1280 kb

yield方式:

cost time: 0.72704195976257 s 
cost memory: 0.359375 kb 
peak memory: 256 kb

结论已经非常明显了,采用yield的确能很大程度上节省内存,但执行速度会有所影响,用不用就取决于你咯!

如果您觉得您在我这里学到了新姿势,博主支持转载,姿势本身就是用来相互学习的。同时,本站文章如未注明均为 hisune 原创 请尊重劳动成果 转载请注明 转自: php5.5新特性之yield性能测试 - hisune.com