• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

遇到一个面试题关于数组

php 搞代码 3年前 (2022-01-25) 14次浏览 已收录 0个评论
文章目录[隐藏]

往数组添充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-&#8230;
http://gywbd.github.io/posts/2014/12/php7-new-hashtable-implementation&#8230; (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点赞!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:遇到一个面试题关于数组

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址