• PHP yield代替range生成范围内的数


     1 <?php
     2 function yieldRange($start, $limit, $step)
     3 {
     4     if ($start == $limit || $step == 0) {
     5         return $start;
     6     }
     7 
     8     $mark = ($limit - $start > 0) == ($step > 0);
     9     if (!$mark) {
    10         $step = -$step;
    11     }
    12 
    13     $distance = abs($limit - $start);
    14     for ($i = $start; abs($start - $i) <= $distance; $i += $step) {
    15         yield  $i;
    16     }
    17 }
    18 
    19 $start = microtime(TRUE);
    20 foreach (yieldRange(-1, 10, 1) as $number) {
    21     echo "number$number : " . $number . "
    ";
    22 }
    23 $end = microtime(TRUE);
    24 echo "Time Used : " .($end - $start). "
    ";

    和 PHP 内部的函数 range() 对比了一下,在时间没看出有什么的优势,主要是在内存的使用 方式 上吧,有些情况 range() 的使用方式内存占用还是比较大的.

    下面的情况内存使用情况的是差不多的:

    yield.php

     1 <?php
     2 function yieldRange($start, $limit, $step)
     3 {
     4     if ($start == $limit || $step == 0) {
     5         return $start;
     6     }
     7 
     8     $mark = ($limit - $start > 0) == ($step > 0);
     9     if (!$mark) {
    10         $step = -$step;
    11     }
    12 
    13     $distance = abs($limit - $start);
    14     for ($i = $start; abs($start - $i) <= $distance; $i += $step) {
    15         yield  $i;
    16     }
    17 }
    18 
    19 echo "yield start memory : " . memory_get_usage()." bytes
    ";
    20 foreach (yieldRange(1, 10000, 1) as $yield) {
    21 }
    22 echo "yield end memory : " . memory_get_usage()." bytes
    ";

    range.php

    1 <?php
    2 echo "range() start memory : " . memory_get_usage()." bytes
    ";
    3 foreach (range(1, 10000, 1) as $range) {
    4 }
    5 echo "range() end memory : " . memory_get_usage()." bytes
    ";

    差不多就是 32 个字节的使用,刚好32位的指针地址.(平台可能有差异)

    但是,如果直接把 range() 的返回值赋给一个变量,那就不只是 32 个字节的的问题了.

    1 <?php
    2 echo "range() start memory : " . memory_get_usage()." bytes
    ";
    3 $ranges = range(1, 10000, 1);
    4 foreach ($ranges as $range) {
    5 }
    6 echo "range() end memory : " . memory_get_usage()." bytes
    ";

    学习记录,方便复习
  • 相关阅读:
    postgresql字符串函数
    ruby中的设计模式--策略模式
    (转)MySQL 性能优化的最佳20多条经验分享
    (转)ruby中的设计模式--模板方法
    观察者模式的应用
    postgresql的ARRAY_TO_STRING
    ruby和javascript的观察者模式
    mysql表连接的时候注意事项
    checkbox记忆功能的实现
    order by的注意事项
  • 原文地址:https://www.cnblogs.com/jingjingdidunhe/p/7209901.html
Copyright © 2020-2023  润新知