php使用yield对性能提升的测试实例分析


Posted in PHP onSeptember 19, 2019

本文实例讲述了php使用yield对性能提升的测试。分享给大家供大家参考,具体如下:

生成器提供了一种更容易的方法来实现简单的对象迭代,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低。生成器允许你在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间。相反,你可以写一个生成器函数,就像一个普通的自定义函数一样, 和普通函数只返回一次不同的是, 生成器可以根据需要 yield 多次,以便生成需要迭代的值。

有两个php文件,demo1.php与demo2.php,两种不同的方式实现求0,到5000之间的数字的平方值并输出,并打印脚本运行的时间与使用的内存大小。

demo1.php

<?php
$startMemory = memory_get_usage(); 
$startTime = time();
function convert($size)
{
    $unit=array('b','kb','mb','gb','tb','pb');
      return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}
function squares($start,$stop){
  $info = '';
  $square = 0;
  for($i=$start;$i<$stop;$i++){
    $square = $i*$i;
    $info .= $i.' squared is '.$square.PHP_EOL;
  }
  return $info;
}
$info = squares(0,50000);
echo $info.PHP_EOL;
$endTime = time();
$useTime = $endTime-$startTime;
$endMemory = memory_get_usage(); 
$useMemory = $endMemory-$startMemory;
echo "总共占用的内存大小为:".convert($useMemory).PHP_EOL;
echo "总共占用的时间为:".$useTime.'秒'.PHP_EOL;

运行结果如下:

49993 squared is 2499300049
49994 squared is 2499400036
49995 squared is 2499500025
49996 squared is 2499600016
49997 squared is 2499700009
49998 squared is 2499800004
49999 squared is 2499900001

总共占用的内存大小为:1.28 mb
总共占用的时间为:5秒

demo2.php

<?php
$startMemory = memory_get_usage(); 
$startTime = time();
function convert($size)
{
  $unit=array('b','kb','mb','gb','tb','pb');
  return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}
function squares($start,$stop){
  for($i = $start;$i<$stop;$i++){
    yield $i=>$i*$i;
  }
}
foreach(squares(0,50000) as $n=>$square ){
  echo $n.' squared is '.$square.PHP_EOL;
}
$endTime = time();
$useTime = $endTime-$startTime;
$endMemory = memory_get_usage(); 
$useMemory = $endMemory-$startMemory;
echo "总共占用的内存大小为:".convert($useMemory).PHP_EOL;
echo "总共占用的时间为:".$useTime.'秒'.PHP_EOL;

运行demo2.php结果如下:

49988 squared is  2498800144
49989 squared is  2498900121
49990 squared is  2499000100
49991 squared is  2499100081
49992 squared is  2499200064
49993 squared is  2499300049
49994 squared is  2499400036
49995 squared is  2499500025
49996 squared is  2499600016
49997 squared is  2499700009
49998 squared is  2499800004
49999 squared is  2499900001
总共占用的内存大小为:32 b
总共占用的时间为:5秒

总结:对比发现,可能由于脚本计算比较简单,运行的时间没啥太大变化。明显发现使用yield后占用内存的量要少很多。说明使用yield还是对性能提升很有帮助的,像类似的一次性拉取大数据量的数据都可以考虑使用yield实现(数据统计等).

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
html中select语句读取mysql表中内容
Oct 09 PHP
IIS下配置Php+Mysql+zend的图文教程
Dec 08 PHP
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
Mar 03 PHP
php中通过Ajax如何实现异步文件上传的代码实例
May 07 PHP
php实现无限级分类
Dec 24 PHP
PHP生成随机字符串(3种方法)
Sep 25 PHP
基于php实现随机合并数组并排序(原排序)
Nov 26 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
May 20 PHP
thinkphp框架实现删除和批量删除
Jun 29 PHP
PHP面向对象之工作单元(实例讲解)
Jun 26 PHP
php根据命令行参数生成配置文件详解
Mar 15 PHP
php正则表达式使用方法整理集合
Jan 31 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
Sep 19 #PHP
php+redis实现消息队列功能示例
Sep 19 #PHP
php文件包含的几种方式总结
Sep 19 #PHP
smarty模板的使用方法实例分析
Sep 18 #PHP
PHP MVC框架中类的自动加载机制实例分析
Sep 18 #PHP
PHP切割整数工具类似微信红包金额分配的思路详解
Sep 18 #PHP
php实现多站点共用session实现单点登录的方法详解
Sep 18 #PHP
You might like
星际争霸中的对战模式介绍
2020/03/04 星际争霸
php 更新数据库中断的解决方法
2009/06/05 PHP
Zend的MVC机制使用分析(二)
2013/05/02 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
php安全配置记录和常见错误梳理(总结)
2017/03/28 PHP
php中的explode()函数实例介绍
2019/01/18 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
javascript同步Import,同步调用外部js的方法
2008/07/08 Javascript
IE和firefox浏览器的event事件兼容性汇总
2009/12/06 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
2015/04/07 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
zTree插件下拉树使用入门教程
2016/04/11 Javascript
BootStrap中
2016/12/10 Javascript
jQuery在header中设置请求信息的方法
2017/03/06 Javascript
详谈js原型继承的一些问题
2017/09/06 Javascript
Angular5集成eventbus的示例代码
2018/07/19 Javascript
js实现按钮开关单机下拉菜单效果
2018/11/22 Javascript
[01:06:32]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第一局
2016/02/28 DOTA
python 基础学习第二弹 类属性和实例属性
2012/08/27 Python
Python基础学习之类与实例基本用法与注意事项详解
2019/06/17 Python
anaconda如何查看并管理python环境
2019/07/05 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
2020/05/28 Python
python如何快速生成时间戳
2020/07/21 Python
丝芙兰中国官方商城:SEPHORA中国
2018/01/10 全球购物
数以千计的折扣工业产品:ESE Direct
2018/05/20 全球购物
欧洲、亚洲、非洲和拉丁美洲的度假套餐:Great Value Vacations
2019/03/30 全球购物
日本化妆品植村秀俄罗斯官方网站:Shu Uemura俄罗斯
2020/02/01 全球购物
AJAX检测用户名是否存在的方法
2021/03/24 Javascript
乡下人家教学反思
2014/02/01 职场文书
学雷锋志愿者活动总结
2014/06/27 职场文书
社团活动总结报告
2014/06/27 职场文书
应届生求职自荐信
2014/07/04 职场文书
2014国庆节标语口号
2014/09/19 职场文书
企业党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
四则混合运算教学反思
2016/02/23 职场文书