Home  >  Q&A  >  body text

php - 遇到一个面试题关于数组

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

巴扎黑巴扎黑2772 days ago730

reply all(6)I'll reply

  • 怪我咯

    怪我咯2017-04-10 15:47:44

    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字节
    

    reply
    0
  • PHPz

    PHPz2017-04-10 15:47:44

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

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

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 15:47:44

    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)

    reply
    0
  • 黄舟

    黄舟2017-04-10 15:47:44

    这样?

    $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);
    

    reply
    0
  • 黄舟

    黄舟2017-04-10 15:47:44

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

    reply
    0
  • 黄舟

    黄舟2017-04-10 15:47:44

    为使用PHP7的PHPer点赞!

    reply
    0
  • Cancelreply