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 相关文章推荐
网络资源
Oct 09 PHP
MYSQL 小技巧 -- LAST_INSERT_ID
Nov 24 PHP
Windows7下PHP开发环境安装配置图文方法
May 20 PHP
PHP的cURL库功能简介 抓取网页、POST数据及其他
Apr 07 PHP
PHP数组循环操作详细介绍 附实例代码
Feb 03 PHP
PHP中HTML标签过滤技巧
Jan 07 PHP
基于php判断客户端类型
Oct 14 PHP
PHP实现类似于C语言的文件读取及解析功能
Sep 01 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
Referer原理与图片防盗链实现方法详解
Jul 03 PHP
Laravel如何实现自动加载类
Oct 14 PHP
PHP 超级全局变量相关总结
Jun 30 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
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
2017/05/29 PHP
javascript中的几个运算符
2007/06/29 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
2012/08/24 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
Jquery实现由下向上展开效果的例子
2014/12/08 Javascript
JS控制网页动态生成任意行列数表格的方法
2015/03/09 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
JavaScript算法系列之快速排序(Quicksort)算法实例详解
2016/09/04 Javascript
前端设计师们最常用的JS代码汇总
2016/09/25 Javascript
基于jQuery实现顶部导航栏功能
2016/12/27 Javascript
JS中使用正则表达式g模式和非g模式的区别
2017/04/01 Javascript
vue 项目如何引入微信sdk接口的方法
2017/12/18 Javascript
从零开始最小实现react服务器渲染详解
2018/01/26 Javascript
vue进行图片的预加载watch用法实例讲解
2018/02/07 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
2018/03/01 Javascript
Nuxt配合Node在实际生产中的应用详解
2018/08/07 Javascript
vue打包使用Nginx代理解决跨域问题
2018/08/27 Javascript
jQuery使用each遍历循环的方法
2018/09/19 jQuery
Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解
2019/04/20 Javascript
layui中的switch开关实现方法
2019/09/03 Javascript
vue解决花括号数据绑定不成功的问题
2019/10/30 Javascript
vue制作抓娃娃机的示例代码
2020/04/17 Javascript
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
python多线程用法实例详解
2015/01/15 Python
Pycharm远程调试openstack的方法
2017/11/21 Python
Python实现霍夫圆和椭圆变换代码详解
2018/01/12 Python
python pandas dataframe 行列选择,切片操作方法
2018/04/10 Python
python 中的paramiko模块简介及安装过程
2020/02/29 Python
appium+python adb常用命令分享
2020/03/06 Python
linux面试题参考答案(2)
2015/12/06 面试题
Windows和Linux动态库应用异同
2016/07/28 面试题
毕业生实习鉴定
2013/12/11 职场文书
德语专业求职信
2014/03/12 职场文书
党的群众路线教育实践活动个人批评与自我批评
2014/10/16 职场文书
信用卡工资证明范本
2014/10/17 职场文书