生成器提供了一种更容易的方法来实现简单的对象迭代,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低。生成器允许你在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间。相反,你可以写一个生成器函数,就像一个普通的自定义函数一样, 和普通函数只返回一次不同的是, 生成器可以根据需要 yield 多次,以便生成需要迭代的值。

有两个php文件,demo1.php与demo2.php,两种不同的方式实现求0,到5000之间的数字的平方值并输出,并打印脚本运行的时间与使用的内存大小。

demo1.php
  1. <?php
  2. $startMemory = memory_get_usage();
  3. $startTime = time();
  4. function convert($size)
  5. {
  6. $unit=array('b','kb','mb','gb','tb','pb');
  7. return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
  8. }
  9. function squares($start,$stop){
  10. $info = '';
  11. $square = 0;
  12. for($i=$start;$i<$stop;$i++){
  13. $square = $i*$i;
  14. $info .= $i.' squared is '.$square.PHP_EOL;
  15. }
  16. return $info;
  17. }
  18. $info = squares(0,50000);
  19. echo $info.PHP_EOL;
  20. $endTime = time();
  21. $useTime = $endTime-$startTime;
  22. $endMemory = memory_get_usage();
  23. $useMemory = $endMemory-$startMemory;
  24. echo "总共占用的内存大小为:".convert($useMemory).PHP_EOL;
  25. echo "总共占用的时间为:".$useTime.'秒'.PHP_EOL;

运行结果如下:

  1. 49993 squared is 2499300049
  2. 49994 squared is 2499400036
  3. 49995 squared is 2499500025
  4. 49996 squared is 2499600016
  5. 49997 squared is 2499700009
  6. 49998 squared is 2499800004
  7. 49999 squared is 2499900001
  8. 总共占用的内存大小为:1.28 mb
  9. 总共占用的时间为:5
demo2.php
  1. <?php
  2. $startMemory = memory_get_usage();
  3. $startTime = time();
  4. function convert($size)
  5. {
  6. $unit=array('b','kb','mb','gb','tb','pb');
  7. return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
  8. }
  9. function squares($start,$stop){
  10. for($i = $start;$i<$stop;$i++){
  11. yield $i=>$i*$i;
  12. }
  13. }
  14. foreach(squares(0,50000) as $n=>$square ){
  15. echo $n.' squared is '.$square.PHP_EOL;
  16. }
  17. $endTime = time();
  18. $useTime = $endTime-$startTime;
  19. $endMemory = memory_get_usage();
  20. $useMemory = $endMemory-$startMemory;
  21. echo "总共占用的内存大小为:".convert($useMemory).PHP_EOL;
  22. echo "总共占用的时间为:".$useTime.'秒'.PHP_EOL;

运行demo2.php结果如下:

  1. 49988 squared is 2498800144
  2. 49989 squared is 2498900121
  3. 49990 squared is 2499000100
  4. 49991 squared is 2499100081
  5. 49992 squared is 2499200064
  6. 49993 squared is 2499300049
  7. 49994 squared is 2499400036
  8. 49995 squared is 2499500025
  9. 49996 squared is 2499600016
  10. 49997 squared is 2499700009
  11. 49998 squared is 2499800004
  12. 49999 squared is 2499900001
  13. 总共占用的内存大小为:32 b
  14. 总共占用的时间为:5
  1. 总结:对比发现,可能由于脚本计算比较简单,运行的时间没啥太大变化。明显发现使用yield后占用内存的量要少很多。说明使用yield还是对性能提升很有帮助的,像类似的一次性拉取大数据量的数据都可以考虑使用yield实现(数据统计等).

yield对性能提升的一次小小测试的更多相关文章

  1. 揭秘Sql2014新特性-tempdb性能提升

    一直以来,在高负载,复杂的生产环境中,tempdb的压力是成为整个实例瓶颈的重要因素之一.微软的工程师们也在各个版本中不断优化它的使用.到了Sql Server2014又有了新的特性使其性能得temp ...

  2. async/await 的基本实现和 .NET Core 2.1 中相关性能提升

    前言 这篇文章的开头,笔者想多说两句,不过也是为了以后再也不多嘴这样的话. 在日常工作中,笔者接触得最多的开发工作仍然是在 .NET Core 平台上,当然因为团队领导的开放性和团队风格的多样性(这和 ...

  3. SQL Server 2014里的性能提升

    在这篇文章里我想小结下SQL Server 2014引入各种惊艳性能提升!! 缓存池扩展(Buffer Pool Extensions) 缓存池扩展的想法非常简单:把页文件存储在非常快的存储上,例如S ...

  4. mapreduce性能提升2

    mapreduce性能提升2mapreduce性能提升2mapreduce性能提升2

  5. YbSoftwareFactory 代码生成插件【二十一】:Web Api及MVC性能提升的几个小技巧

    最近在进行 YbSoftwareFactory 的流程功能升级,目前已经基本完成,现将用到的一些关于 Web Api 及 MVC 性能提升的一些小技巧进行了总结,这些技巧在使用.配置上也相当的简单,但 ...

  6. 在PYTHON中使用StringIO的性能提升实测(更新list-join对比)

    刚开始学习PYTHON,感觉到这个语言真的是很好用,可以快速完成功能实现. 最近试着用它完成工作中的一个任务:在Linux服务器中完成对.xml.gz文件的解析,生成.csv文件,以供SqlServe ...

  7. paip.cache 缓存架构以及性能提升总结

    paip.cache 缓存架构以及性能提升总结 1         缓存架构以及性能(贯穿读出式(LookThrough) 旁路读出式(LookAside) 写穿式(WriteThrough) 回写式 ...

  8. C# 程序性能提升篇-1、装箱和拆箱,枚举的ToString浅析

    前景提要: 编写程序时,也许你不经意间,就不知不觉的使程序代码,发生了装箱和拆箱,从而降低了效率,不要说就发生那么一次两次,如果说是程序中发生了循环.网络程序(不断请求处理的)等这些时候,减少装箱和拆 ...

  9. 天天动听MP3解码器性能提升50%

    天天动听今日升级提醒,发现有一句 “使用新的MP3解码器,性能提升50%”,太惊讶了. 之前版本的MP3解码器使用libmpg123,效果已经是MP3解码器中非常不错的了. 50%的提升,应该不仅仅是 ...

随机推荐

  1. $digest already in progress 解决办法

    Solution In short, instead of doing this: ... your controller code... $http.get('some/url', function ...

  2. JavaScript学习总结(十四)——JavaScript编写类的扩展方法

    在​J​a​v​a​S​c​r​i​p​t​中​可以使​用​类的p​r​o​t​o​t​y​p​e属性来​扩​展​类的属​性​和​方​法,在实际开发当中,当JavaScript内置的那些类所提供的动态 ...

  3. kill prefix extra,endo out 1

      1●extra 超过外面的, 以外的,外面 的   2●endo   内部  

  4. Unicode与UTF-8,UTF-16

    Unicode(UTF-8, UTF-16)令人混淆的概念 为啥需要Unicode 我们知道计算机其实挺笨的,它只认识0101这样的字符串,当然了我们看这样的01串时肯定会比较头晕的,所以很多时候为了 ...

  5. 解密微信sqlite数据库

    最近在研究解密微信APP的数据库, 1.通过Android手机内置备份功能,可以获取到微信的数据库文件,再通过adb传到电脑上. 2.获取微信EnMicroMsg.db库的密码(通过IMEI和uin值 ...

  6. myeclipse设置jvm参数的三种方式

    方法一: 打开eclipse,选择Window--Preferences...在对话框左边的树上双击Java,再双击Installed JREs,在右边选择前面有对勾的JRE,再单击右边的“Edit” ...

  7. localstorage检测

    localstorage检测 初来乍到,刚刚接触一个从零开始的移动wap项目,希望内容根据策略(正在思考中)在浏览器中缓存,appcache.localstorage都作为泛化知识进行了解和练习,知道 ...

  8. CUDA ---- Dynamic Parallelism

    Dynamic Parallelism 到目前为止,所有kernel都是在host端调用,GPU的工作完全在CPU的控制下.CUDA Dynamic Parallelism允许GPU kernel在d ...

  9. 如何在<textarea>标签中使用并解析HTML标签

    例如: <textarea name="intro" placeholder="请输入内容" maxlength="800">& ...

  10. Java实现责任链模式

    责任链模式: 将接受者对象连成一条链,并在该链上传递请求,直到一个几首这对象处理它.通过让更多对象有机会处理请求,避免了请求发送者和接受者之间的耦合. 责任链模式的优缺点: 优点:高内聚,低耦合.业务 ...