一道面试题
如果让你用 PHP 生成从 1 到100 万个数值,请问怎么做才能最省内存?
没错,这是一道面试题,如果让你写出答案,你会有什么样的思路呢?请先独自思考几分钟。
可能你想到的会是这种方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <?php
function makeLargeArray($length){ $dataset = []; for ($i = 0; $i < $length; $i++) { $dataset[] = $i; } return $dataset; } $customRange = makeLargeArray(1000000); foreach ($customRange as $i) { echo $i, PHP_EOL; }
function formatBytes($bytes, $precision = 2) { $units = array("b", "kb", "mb", "gb", "tb");
$bytes = max($bytes, 0); $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); $pow = min($pow, count($units) - 1);
$bytes /= (1 << (10 * $pow));
return round($bytes, $precision) . " " . $units[$pow]; }
print formatBytes(memory_get_peak_usage());
|
你如果给出这种答案的话,肯定不会让面试官满意的。因为这道题的重点是节省内存,如果是如上的程序,虽然能够实现题目的前半部分要求,但实际运行起来却是一个非常吃内存的老虎。因为从 PHP 底层分析, makeLargeArray()
会预先创建一个由一百万个整数组成的数组分配内存!
那么到底要怎么做才能既节省内存,又能实现这道题的目标呢?