为什么全球化数组会降低性能


Why does globalizing an array decrease performance?

让我首先声明,我知道使用全局变量不是最佳实践,这只是一个临时的调整,直到更广泛的重写完成。也就是说…

我遇到一些代码被重复了3次,像这样。

template_1加载数组,然后过滤数据,然后加载template_part_2。Template_part_2再次加载数组并过滤出完全相同的数据,然后加载module_1。Module_1再次加载数组,并过滤出与前两个完全相同的数据。结果如下所示:

include_array.php

    function load_array(){ 
        <multidimensional array here>
    };

template_1.php

    include_once(include_array.php);
    $array = load_array();
    // code to filter array
    include_once(template_1_part_2.php);

template_1_part_2.php

    $array = load_array();
    // code to filter array
    include_once(module_1.php);

module_1.php

    $array = load_array();
    // code to filter array

这对我来说似乎没有必要,而且浪费内存,所以我将其更改为只过滤一次,然后在随后的文件中将其全球化,如下所示:

include_array.php

    function load_array(){ 
        <multidimensional array here>
    };

template_1.php

    include_once(include_array.php);
    $array = load_array();
    // code to filter array
    include_once(template_1_part_2.php);

template_1_part_2.php

    global $array;
    include_once(module_1.php);

module_1.php

    global $array;

现在这个更改为每次加载页面节省了2mb的内存,但是页面加载速度慢了0.03秒。内存减少了18%,但加载速度却慢了25%。我认为它的内存效率更高,速度更快,因为它做的处理更少,但我看到的不是这样。我试着做了一些研究,为什么会这样,但我没有发现任何东西,有人能解释一下这个谜团吗?

提前感谢!

我想你不明白在PHP中包含文件是如何工作的。基本上,当你包含一个文件的时候,它就像代码被附加到做包含的那个。在所有函数之外定义的任何变量都可以被代码(即在所有函数之外)从所有文件中自动访问。因此,只有在函数内部,您才必须使用global关键字来访问全局变量。您不需要使用global关键字来使一个文件中的变量在其他文件中可访问:您已经将所有文件包含在一个文件中,因此您不必做任何特别的事情来让它们共享。

医生这样说:

当包含一个文件时,它所包含的代码将继承该变量发生包含的行的作用域。任何可用的变量在调用文件的那一行将在被调用的范围内可用档案,从那时起。但是,所有的函数和类在包含的文件中定义的具有全局作用域。

然而:

如果包含发生在调用文件的函数内,则被调用文件中包含的所有代码都将表现为

让你的include全局化,也就是在所有函数之外,这样你就不需要跳过所有这些环节