往數組添充20萬個元素,怎麼保證記憶體開銷最小,面試官平常比如幾十MB,他能做到10MB,,他說的啥我記不清了,說的很含糊,好像說數組迭代和壓縮什麼,求大神,這是怎麼做到的?
回複內容:
往數組添充20萬個元素,怎麼保證記憶體開銷最小,面試官平常比如幾十MB,他能做到10MB,,他說的啥我記不清了,說的很含糊,好像說數組迭代和壓縮什麼,求大神,這是怎麼做到的?
PHP7測試了下,傳統的for迴圈記憶體佔用比yield實現的迭代器小,但相差不大.
使用產生器的方案是記憶體最節省的.
php
function xrange($start,$end){ for ($i = $start; $i <= $end; $i++) { yield $i; }}$arr = [];foreach (xrange(1,20000) as $num){ $arr[] = $num;}
記憶體佔用大概是1樓的1/3左右.當然1樓相比最傳統的方案($arr=range(1,200000))已經節省了大概50%左右的記憶體了.
測試環境PHP 5.6.10
額外測試了下,在php7的情況下,確實如@eechen同學所說,基本沒差別了.
php
$array = new SplFixedArray(200000);for ($i = 0; $i < 200000; ++$i) { $array[$i] = $i;}
11534336 還是多了差不多0.15~~~ 召喚大神@公子
(Windows8.1 64位, PHP5.6)
https://nikic.github.io/2011/12/12/How-big-are-PHP-arrays-really-Hint-...
http://gywbd.github.io/posts/2014/12/php7-new-hashtable-implementation... (php7)
這樣?
$arr = new ArrayIterator();for ($i = 1; $i <= 200000; $i++) { $arr->append($i);}
還是這樣?
$xrange = function($min, $max) { for ($i = $min; $i <= $max; $i++) { yield $i; }};$xrange(1,200000);
題目意義不明,20w個什麼元素,PHP下?還是C下?
為使用PHP7的PHPer點贊!