PHP:为什么使用`global`比在函数内声明变量要慢?

时间:2017-08-10 17:20:35

标签: php variables global

我一直在阅读PHP手册页,但我显然读错了。我运行了一些简单的测试,看看获取变量的方法更快:使用global,在函数内声明变量,或者使用声明的常量。

要点:

  1. 声明变量(例如$keyspace = 012...;)最快。
  2. 使用global(例如global $keyspace;)。
  3. 定义常量(例如,define('keyspace', '01234...');最慢。
  4. 问题:为什么使用globaldefine比在PHP中声明变量要慢?

    (1)变量定义的外部函数,函数使用global

    $keyspace = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    function buildSKU(){
            global $keyspace;
            $sku = '';
            $max = mb_strlen($keyspace, '8bit') - 1;
            for ($i = 0; $i < 8; ++$i) {
                    $sku .= $keyspace[random_int(0, $max)];
            }
            return $sku;
    }
    

    (2)函数内部的变量

    function buildSKU(){
            $keyspace = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
            $sku = '';
            $max = mb_strlen($keyspace, '8bit') - 1;
            for ($i = 0; $i < 8; ++$i) {
                    $sku .= $keyspace[random_int(0, $max)];
            }
            return $sku;
    }
    

    (3)变量定义为常量

    define('keyspace', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ');
    function buildSKU(){
            $sku = '';
            $max = mb_strlen(keyspace, '8bit') - 1;
            for ($i = 0; $i < 8; ++$i) {
                    $sku .= keyspace[random_int(0, $max)];
            }
            return $sku;
    }
    

    我的试验台:

    <?php
    
    $start = microtime(true);
    //Put (1) or (2) here...
    for($i=0; $i<10000; $i++){ buildSKU(); }
    $end = microtime(true) - $start;
    echo "\n\nTime: ".$end."\nMemory:".memory_get_peak_usage(true)."\n\n";
    

3 个答案:

答案 0 :(得分:2)

你的头衔有点误导。函数变量不会被反复“声明”,在编写函数代码时会声明一次。你还专注于苹果与橘子的比较。

使用函数变量示例,变量的范围完全不同。一旦函数完成,在函数内声明的局部变量就不再存在(至少从范围的角度来看)。它也被初始化,不像全局的例子,函数开头的变量状态是完全未知的。

当答案更简单时,你花了很多时间研究微优化和无意义的基准。使用global关键字将变量注入函数范围永远不会更好。

你有参数可以通过引用或值传递,但你没有评估这些选项,虽然我必须重申,在我看来,你真的不会发现任何有趣的东西。

在大多数创建编译程序的语言中,函数变量在堆栈上分配。一旦函数完成,该内存区域将从堆栈中弹出并被丢弃。然而,PHP有一个可变的命名和内存分配方案,它在所有变量和对象之间共享。您可以搜索有关'php zval'和php internals的信息,并了解有关变量分配方式,引用计数以及通过符号表与名称相关联的更多信息。

这里要说的重点是,无论变量的类型如何,变量分配都以相同的方式发生,因此对纯粹的变量分配语法的性能的任何期望都不可能提供任何有意义的差异。

PHP会针对什么时候需要创建一个新的zval或者只是在同一个点上指向多个符号做出各种决定,这对你来说是透明的。

答案 1 :(得分:0)

我认为全局的主要问题是依赖问题,你的整个代码库将依赖于该全局变量及其存在,随着代码的增长,很难跟踪和解决问题。即使更改名称,也需要在代码中的任何位置进行更改。

如果密钥没有改变,你的代码中的

应该考虑使用常量。

答案 2 :(得分:0)

除非绝对需要,否则始终使用局部变量,并且没有别的办法。