遇到一个面试题关于数组

发布于 2022-09-01 13:02:54 字数 95 浏览 29 评论 0

往数组添充20万个元素,怎么保证内存开销最小,面试官平常比如几十MB,他能做到10MB,,他说的啥我记不清了,说的很含糊,好像说数组迭代和压缩什么,求大神,这是怎么做到的?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

﹉夏雨初晴づ 2022-09-08 13:02:54

PHP7测试了下,传统的for循环内存占用比yield实现的迭代器小,但相差不大.

<?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) {
    $arr[$i] = $i;
}

echo memory_get_peak_usage()."\n";
echo memory_get_usage()."\n";
// 传统的for循环: 9789696字节(峰值) 6639888字节
// 语法糖迭代器:  9795176字节(峰值) 6640952字节
为你鎻心 2022-09-08 13:02:54

使用生成器的方案是内存最节省的.

phpfunction 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同学所说,基本没差别了.

还不是爱你 2022-09-08 13:02:54
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)

做个ˇ局外人 2022-09-08 13:02:54

这样?

$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);
‖放下 2022-09-08 13:02:54

题目意义不明,20w个什么元素,PHP下?还是C下?

恍梦境° 2022-09-08 13:02:54

为使用PHP7的PHPer点赞!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文