前言
最近工作有点忙,我好不容易抽空更下博客。
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
0 Comments