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 相关文章推荐
在PHP中使用XML
Oct 09 PHP
php 保留小数点
Apr 21 PHP
谈PHP生成静态页面分析 模板+缓存+写文件
Aug 17 PHP
模板引擎正则表达式调试小技巧
Jul 20 PHP
PHP删除HTMl标签的实现代码
Jun 30 PHP
php判断对象是派生自哪个类的方法
Jun 20 PHP
PHP常用设计模式之委托设计模式
Feb 13 PHP
Yii使用migrate命令执行sql语句的方法
Mar 15 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
Mar 23 PHP
PHP树-不需要递归的实现方法
Jun 21 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
Mar 14 PHP
php微信公众号开发之校园图书馆
Oct 20 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实现框架(二)
2006/10/09 PHP
最省空间的计数器
2006/10/09 PHP
PHP中file_exists与is_file,is_dir的区别介绍
2012/09/12 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
2014/08/06 PHP
Codeigniter实现发送带附件的邮件
2015/03/19 PHP
PHP MySql增删改查的简单实例
2016/06/21 PHP
PHP 匿名函数与注意事项详细介绍
2016/11/26 PHP
JavaScript 继承详解 第一篇
2009/08/30 Javascript
javascript动态加载二
2012/08/22 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
非常实用的12个jquery代码片段
2015/11/02 Javascript
整理JavaScript创建对象的八种方法
2015/11/03 Javascript
Node.js 文件夹目录结构创建实例代码
2016/07/08 Javascript
js实现表单及时验证功能 用户信息立即验证
2016/09/13 Javascript
JS实现类似百叶窗下拉菜单效果
2016/12/30 Javascript
深入理解jquery的$.extend()、$.fn和$.fn.extend()
2017/07/08 jQuery
解决React Native端口号修改的方法
2017/07/28 Javascript
BootStrap 页签切换失效的解决方法
2017/08/17 Javascript
Vue.js实现网格列表布局转换方法
2017/08/25 Javascript
jQuery 实现左右两侧菜单添加、移除功能
2018/01/02 jQuery
vue.js多页面开发环境搭建过程
2019/04/24 Javascript
elementUI select组件value值注意事项详解
2019/05/29 Javascript
Echarts地图添加引导线效果(labelLine)
2019/09/30 Javascript
跟老齐学Python之编写类之一创建实例
2014/10/11 Python
python中input()与raw_input()的区别分析
2016/02/27 Python
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
Python3基础教程之递归函数简单示例
2019/06/07 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
全球最大的在线橄榄球商店:Lovell Rugby
2018/05/20 全球购物
高分子材料与工程专业个人求职信
2013/12/15 职场文书
槐乡的孩子教学反思
2014/04/27 职场文书
本科毕业生应聘自荐信范文
2014/06/26 职场文书
做一个有道德的人活动方案
2014/08/25 职场文书
2015年社区中秋节活动总结
2015/03/23 职场文书
资金申请报告范文
2015/05/14 职场文书
pytorch 中autograd.grad()函数的用法说明
2021/05/12 Python