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数据库开发知多少
Oct 09 PHP
来自PHP.NET的入门教程
Oct 09 PHP
PHP获取网址的顶级域名函数代码
Sep 24 PHP
PHP错误处理函数
Apr 03 PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
May 12 PHP
php连接oracle数据库的核心步骤
May 26 PHP
php 输入输出流详解及示例代码
Aug 25 PHP
php实现base64图片上传方式实例代码
Feb 22 PHP
PHP将身份证正反面两张照片合成一张图片的代码
Apr 08 PHP
php使用curl伪造来源ip和refer的方法示例
May 08 PHP
Yii2框架实现利用mpdf创建pdf文件功能示例
Feb 08 PHP
php下的原生ajax请求用法实例分析
Feb 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
咖啡的传说和历史
2021/03/03 新手入门
解析 thinkphp 框架中的部分方法
2017/05/07 PHP
javascript getElementsByName()的用法说明
2009/07/31 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
自己动手制作jquery插件之自动添加删除行功能介绍
2011/10/14 Javascript
js图片延迟加载的实现方法及思路
2013/07/22 Javascript
jQuery实现平滑滚动页面到指定锚点链接的方法
2015/07/15 Javascript
浅谈几种常用的JS类定义方法
2016/06/08 Javascript
通过Ajax使用FormData对象无刷新上传文件方法
2016/12/08 Javascript
基于vue2.0+vuex的日期选择组件功能实现
2017/03/13 Javascript
Bootstrap超大屏幕的实现代码
2017/03/22 Javascript
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
React 实现拖拽功能的示例代码
2019/01/06 Javascript
Node.js Stream ondata触发时机与顺序的探索
2019/03/08 Javascript
Vue-cli项目部署到Nginx服务器的方法
2019/11/01 Javascript
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
[52:52]完美世界DOTA2联赛PWL S3 LBZS vs access 第一场 12.10
2020/12/13 DOTA
Python中for循环和while循环的基本使用方法
2015/08/21 Python
python 连接sqlite及简单操作
2017/06/30 Python
python3操作微信itchat实现发送图片
2018/02/24 Python
详解python 注释、变量、类型
2018/08/10 Python
Python正则表达式和re库知识点总结
2019/02/11 Python
Python Numpy库常见用法入门教程
2020/01/16 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
python 写函数在一定条件下需要调用自身时的写法说明
2020/06/01 Python
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
后备干部考察材料
2014/02/12 职场文书
解除劳动合同协议书范本
2014/04/14 职场文书
《她是我的朋友》教学反思
2014/04/26 职场文书
县委常委班子对照检查材料思想汇报
2014/09/28 职场文书
安装工程师岗位职责
2015/02/13 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
经费申请报告范文
2015/05/18 职场文书
“爱眼护眼,提前预防近视”倡议书3篇
2019/10/30 职场文书
python实现自动化群控的步骤
2021/04/11 Python