往数组添充20万个元素,怎么保证内存开销最小,面试官平常比如几十MB,他能做到10MB,,他说的啥我记不清了,说的很含糊,好像说数组迭代和压缩什么,求大神,这是怎么做到的?
回复内容:
往数组添充20万个元素,怎么保证内存开销最小,面试官平常比如几十MB,他能做到10MB,,他说的啥我记不清了,说的很含糊,好像说数组迭代和压缩什么,求大神,这是怎么做到的?
PHP7测试了下,传统的for循环内存占用比yield实现的迭代器小,但相差不大.
<code><?php////传统的for循环//for($i = 0; $i < 200000; $i++) {// $arr[$i] = $i;//}//语法糖迭代器function xrange($start, $end) { for ($i = $start; $i <= $end; $i++) { yield $i; }}foreach (xrange(1, 200000) as $i) { $<strong style="color:transparent">9来源gaodai#ma#com搞@代~码$网</strong>搞gaodaima代码arr[$i] = $i;}echo memory_get_peak_usage()."\n";echo memory_get_usage()."\n";// 传统的for循环: 9789696字节(峰值) 6639888字节// 语法糖迭代器: 9795176字节(峰值) 6640952字节</code>
使用生成器的方案是内存最节省的.
<code>php</code><code>function xrange($start,$end){ for ($i = $start; $i <= $end; $i++) { yield $i; }}$arr = [];foreach (xrange(1,20000) as $num){ $arr[] = $num;}</code>
内存占用大概是1楼的1/3左右.当然1楼相比最传统的方案($arr=range(1,200000))已经节省了大概50%左右的内存了.
测试环境PHP 5.6.10
额外测试了下,在php7的情况下,确实如@eechen同学所说,基本没差别了.
<code>php</code><code>$array = new SplFixedArray(200000);for ($i = 0; $i < 200000; ++$i) { $array[$i] = $i;}</code>
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)
这样?
<code>$arr = new ArrayIterator();for ($i = 1; $i append($i);}</code>
还是这样?
<code>$xrange = function($min, $max) { for ($i = $min; $i <= $max; $i++) { yield $i; }};$xrange(1,200000);</code>
题目意义不明,20w个什么元素,PHP下?还是C下?
为使用PHP7的PHPer点赞!