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 . "\n";
22 }
23 $end = microtime(TRUE);
24 echo "Time Used : " .($end - $start). "\n";

和 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\n";
20 foreach (yieldRange(1, 10000, 1) as $yield) {
21 }
22 echo "yield end memory : " . memory_get_usage()." bytes\n";

range.php

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

 

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

 

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

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

 

posted @ 2017-07-20 10:40  GoodByeZ  阅读(511)  评论(0编辑  收藏  举报