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 相关文章推荐
PHPMyadmin 配置文件详解(配置)
Dec 03 PHP
php 数组二分法查找函数代码
Feb 16 PHP
解析在zend Farmework下如何创立一个FORM表单
Jun 28 PHP
php中调用其他系统http接口的方法说明
Feb 28 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
Mar 18 PHP
常见PHP数据库解决方案分析介绍
Sep 24 PHP
Thinkphp自定义代码生成工具及用法说明(附下载地址)
May 27 PHP
php结合mysql与mysqli扩展处理事务的方法
Jun 29 PHP
PHP房贷计算器实例代码,等额本息,等额本金
Apr 01 PHP
PHP中快速生成随机密码的几种方式
Apr 17 PHP
php实现网页上一页下一页翻页过程详解
Jun 28 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
smarty模板嵌套之include与fetch性能测试
2010/12/05 PHP
PHP-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
2011/08/15 PHP
php简单生成随机数的方法
2015/07/30 PHP
jquery+ashx无刷新GridView数据显示插件(实现分页、排序、过滤功能)
2010/04/25 Javascript
关于event.cancelBubble和event.stopPropagation()的区别介绍
2011/12/11 Javascript
jQuery Mobile 触摸事件实例
2016/06/04 Javascript
jQuery遍历节点树方法分析
2016/09/08 Javascript
jQuery实现表格文本框淡入更改值后淡出效果
2016/09/27 Javascript
如何提高javascript加载速度
2016/12/26 Javascript
angularJS深拷贝详解
2017/03/23 Javascript
Vue 2.5 Level E 发布了: 新功能特性一览
2017/10/24 Javascript
微信小程序框架wepy之动态控制类名
2018/09/14 Javascript
JavaScript常用数组操作方法,包含ES6方法
2020/05/10 Javascript
jQuery对底部导航进行跳转并高亮显示的实例代码
2019/04/23 jQuery
[52:57]2014 DOTA2国际邀请赛中国区预选赛 LGD-CDEC VS HGT
2014/05/21 DOTA
[43:58]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第二局
2016/02/27 DOTA
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
一个可以套路别人的python小程序实例代码
2019/04/09 Python
Python函数参数匹配模型通用规则keyword-only参数详解
2019/06/10 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
pytorch使用指定GPU训练的实例
2019/08/19 Python
TensorFLow 不同大小图片的TFrecords存取实例
2020/01/20 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
Python基于yield遍历多个可迭代对象
2020/03/12 Python
如何查看Django ORM执行的SQL语句的实现
2020/04/20 Python
用python实现学生管理系统
2020/07/24 Python
pandas map(),apply(),applymap()区别解析
2021/02/24 Python
简单整理HTML5的基本特性和语法
2016/02/18 HTML / CSS
Yahoo-PHP面试题4
2012/05/05 面试题
JDO的含义
2012/11/17 面试题
校园达人秀策划书
2014/01/12 职场文书
与美同行演讲稿
2014/09/13 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
车辆挂靠协议书
2016/03/23 职场文书
人事部:年度述职报告范文
2019/07/12 职场文书
mysql的单列多值存储实例详解
2022/04/05 MySQL