PHP使用的内存比所需文件多。

3

请看以下示例代码:

<?php

if (! function_exists('human_filesize')) {
    function human_filesize($size, $precision = 2, $step = 1000)
    {
        $i = 0;
        $units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];

        while (($size / $step) > 0.9) {
            $size = $size / $step;

            $i++;
        }

        return round($size, $precision) . ' ' . $units[$i];
    }
}

if (! function_exists('dd')) {
    function dd($vars)
    {
        foreach (func_get_args() as $var) {
            var_dump($var);
        }

        die();
    }
}

$start = microtime(true);
$usage = memory_get_usage(true);

require "brown_corpus.php"; // It's 1.6 MB

$dump[] = round(microtime(true) - $start, 3);
$dump[] = human_filesize(memory_get_usage(true) - $usage);

dd(...$dump); // 0.063ms to run | 38.01 MB memory used

brown_corpus.php 文件大小为 1.6 MB,但当脚本需要它时,脚本告诉我它在内存中使用了 38.01 MB。我阅读了一些资料,想知道这是因为 PHP 将所需文件编译成操作码以提高执行速度吗?能否有人让我了解这样做的利弊... 例如,如果我在该要求中搜索数组键,现在是否更快-因为 PHP 编译了文件的方式?

1个回答

2

文件的大小与其消耗的内存量无关。没有看到brown_corpus.php,就不可能知道它如何使用内存,但请记住,代码通常是描述它实际创建的结构的一种压缩方式。考虑以下内容:

$arr = array();
for ($i = 0; $i < 100000; $i++) {
    $arr[$i] = $i;
}

将这段代码保存成php文件,它只需占用大约70个字节的空间。运行它,将创建一个包含100,000个元素的数组结构,每个元素为8个字节的整数。瞬间,就会使用掉800KB的内存。

实际上,情况比这更糟糕,因为PHP在您的系统上的配置以及PHP所施加的各种开销(例如,它存储数组的方式令人费解——请参见https://nikic.github.io/2011/12/12/How-big-are-PHP-arrays-really-Hint-BIG.html)。


这些文章似乎非常好地解释了这个问题。brown_corpus 包含许多键值对的返回数组。因此,这可以解释为什么在需要时会消耗更多的字节进入内存。我想知道使用数据库查询是否更好,但脚本肯定需要更长时间才能运行,但是占用的内存会更少。很快就会给出奖励... - Luka
是的,不同类型使用的内存量差异很大。您可以在任何变量分配之前和之后执行 memory_get_usage() 以获取该类型或结构所使用的大致内存量,但这些值会因系统而异。如果您想比较不同方法的时间,请使用 microtime() 来测量每个方法所需的时间。请参阅 http://php.net/manual/en/function.microtime.php 上的第一个示例。 - Phl3tch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接