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实现WEB动态网页静态
Oct 09 PHP
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
Jul 17 PHP
linux下使用crontab实现定时PHP计划任务失败的原因分析
Jul 05 PHP
php检测apache mod_rewrite模块是否安装的方法
Mar 14 PHP
分享自定义的几个PHP功能函数
Apr 15 PHP
PHP开发中AJAX技术的简单应用
Dec 11 PHP
最新版本PHP 7 vs HHVM 多角度比较
Feb 14 PHP
利用PHP绘图函数实现简单验证码功能的方法
Oct 18 PHP
php异步:在php中使用fsockopen curl实现类似异步处理的功能方法
Dec 10 PHP
Laravel 的数据库迁移的方法
Jul 31 PHP
php的lavarel框架中join和orWhere的用法
Dec 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
php简单操作mysql数据库的类
2015/04/16 PHP
PHP图片添加水印功能示例小结
2016/10/03 PHP
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
jquery实现div拖拽宽度示例代码
2013/07/31 Javascript
js清空form表单中的内容示例
2014/05/20 Javascript
For循环中分号隔开的3部分的执行顺序探讨
2014/05/27 Javascript
jQuery通过Ajax返回JSON数据
2015/04/28 Javascript
javascript实时显示当天日期的方法
2015/05/20 Javascript
jQuery.trim() 函数及trim()用法详解
2015/10/26 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
jQuery+ajax读取并解析XML文件的方法
2016/09/09 Javascript
正则 js分转元带千分符号详解
2017/03/08 Javascript
js,jq,css多方面实现简易下拉菜单功能
2017/05/13 Javascript
Node.js学习之查询字符串解析querystring详解
2017/09/28 Javascript
JavaScript引用类型Function实例详解
2018/08/09 Javascript
在vue中使用echarts图表实例代码详解
2018/10/22 Javascript
关于微信公众号开发无法支付的问题解决
2018/12/28 Javascript
vue图片加载失败时用默认图片替换的方法
2019/08/29 Javascript
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
Python采用Django开发自己的博客系统
2020/09/29 Python
Python基于回溯法子集树模板实现图的遍历功能示例
2017/09/05 Python
Pycharm保存不能自动同步到远程服务器的解决方法
2019/06/27 Python
Python3.7黑帽编程之病毒篇(基础篇)
2020/02/04 Python
python如何判断IP地址合法性
2020/04/05 Python
Python 绘制可视化折线图
2020/07/22 Python
6号汽车旅馆预订:Motel 6
2018/02/11 全球购物
有趣的流行文化T恤、马克杯、手机壳和更多:Look Human
2019/01/07 全球购物
英国历史最悠久的DJ设备供应商:DJ Finance、DJ Warehouse、The DJ Shop
2019/09/04 全球购物
汽车维修专业个人求职信范文
2014/01/01 职场文书
宝宝周岁宴答谢词
2014/01/26 职场文书
幼儿园消防安全制度
2014/01/26 职场文书
奥利奥广告词
2014/03/20 职场文书
2014副局长群众路线对照检查材料思想汇报
2014/09/22 职场文书
监察建议书
2015/02/04 职场文书
幼儿园班级管理心得体会
2016/01/07 职场文书
Java数据结构之链表相关知识总结
2021/06/18 Java/Android