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";
学习记录,方便复习