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 相关文章推荐
PHP5 的对象赋值机制介绍
Aug 02 PHP
phpmyadmin config.inc.php配置示例
Aug 27 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
Nov 12 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
Dec 25 PHP
yii框架builder、update、delete使用方法
Apr 30 PHP
PHP curl 抓取AJAX异步内容示例
Sep 09 PHP
php获取随机数组列表的方法
Nov 13 PHP
PHP实现简单汉字验证码
Jul 28 PHP
thinkPHP5.0框架命名空间详解
Mar 18 PHP
PHP实现随机生成水印图片功能
Mar 22 PHP
PHP使用观察者模式处理异常信息的方法详解
Sep 24 PHP
关于laravel 子查询 &amp; join的使用
Oct 16 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中获得视频时间总长度的另一种方法
2011/09/15 PHP
php加水印的代码(支持半透明透明打水印,支持png透明背景)
2013/01/17 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
2015/04/17 PHP
老司机传授Ubuntu下Apache+PHP+MySQL环境搭建攻略
2016/03/20 PHP
PHP大文件切割上传并带进度条功能示例
2019/07/01 PHP
nodejs中exports与module.exports的区别详细介绍
2013/01/14 NodeJs
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
2016/02/22 Javascript
基于javascript实现图片滑动效果
2016/05/07 Javascript
JavaScript组合模式学习要点
2016/08/26 Javascript
vue学习笔记之v-if和v-show的区别
2017/09/20 Javascript
echarts同一页面中四个图表切换的js数据交互方法示例
2018/07/03 Javascript
layUI实现列表查询功能
2019/07/27 Javascript
[01:05:41]EG vs Optic Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
2015/05/22 Python
[原创]使用豆瓣提供的国内pypi源
2017/07/02 Python
Python基于回溯法子集树模板解决0-1背包问题实例
2017/09/02 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
2018/07/06 Python
python 处理telnet返回的More,以及get想要的那个参数方法
2019/02/14 Python
Python3.5模块的定义、导入、优化操作图文详解
2019/04/27 Python
python 随机生成10位数密码的实现代码
2019/06/27 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
python运用pygame库实现双人弹球小游戏
2019/11/25 Python
基于python检查SSL证书到期情况代码实例
2020/04/04 Python
Numpy中的数组搜索中np.where方法详细介绍
2021/01/08 Python
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
HTML5 b和i标记将被赋予真正的语义
2009/07/16 HTML / CSS
html5的canvas元素使用方法介绍(画矩形、画折线、圆形)
2014/04/14 HTML / CSS
中国最大的名表商城:万表网
2016/08/29 全球购物
Jeep牧马人、切诺基和自由人零配件:4 Wheel Drive Hardware
2017/07/02 全球购物
激励员工的口号
2014/06/16 职场文书
运动会加油稿20字
2014/11/15 职场文书
2015小学五年级班主任工作总结
2015/05/21 职场文书
教育教学读书笔记
2015/07/02 职场文书
Golang实现可重入锁的示例代码
2022/05/25 Golang