zoukankan      html  css  js  c++  java
  • 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
    ";

    学习记录,方便复习
  • 相关阅读:
    Boostrap响应式与非响应式
    Linux文件处理命令
    Linux各目录作用
    linux系统安装
    并发编程之基础( 五)
    Extjs自定义验证介绍
    javascrict中innerhtml和innerText的关系
    List泛型的应用
    winform项目改项目名称
    math.random用法
  • 原文地址:https://www.cnblogs.com/jingjingdidunhe/p/7209901.html
Copyright © 2011-2022 走看看