【问题标题】:Does using global create any overhead?使用全局会产生任何开销吗?
【发布时间】:2010-09-15 22:16:01
【问题描述】:

如果您在最终没有使用的变量上使用 global 关键字,会不会有问题?比较:

function foo() {
    global $fu;
    global $bah;
    if (something()) {
        $fu->doSomething();
    } else {
        $bah->doSomething();
    }
}

function bar() {
    if (something()) {
        global $fu;
        $fu->doSomething();
    } else {
        global $bah;
        $bah->doSomething();
    }
}

我很清楚,使用第二种方法会使代码的维护变得更加困难,并且通常最好将所有全局变量放在函数的开头,因此:忽略可维护性和代码样式的差异在这两个函数中,这两者在开销方面有区别吗?

【问题讨论】:

    标签: php optimization


    【解决方案1】:

    如果有,它将无法(人工)测量,除非您确实调用此函数数百万次。即使它是具有该属性的递归函数,我仍然不会将您的第二种方法用于您已经提出的可维护性方面。

    编辑:为了争论,我实际上去进行了基准测试,bar() 在超过 100 万次调用时最终慢了 0.1 秒。这意味着性能方面,您仍然有理由使用更简洁的版本。

    【讨论】:

      【解决方案2】:

      全局变量通常被认为是非常糟糕的风格。我会声称,每当您需要使用 global 关键字或静态类属性(因此,包括臭名昭著的 Singleton),您应该认真重新考虑您在做什么。避免全局变量可能需要做更多的工作,但它对代码可维护性来说是一个巨大的好处。这个特殊的例子,可以更好地表达为:

      function foo($fu, $bah) {
        if (something()) {
          $fu->doSomething();
        } else {
          $bah->doSomething();
        }
      }
      

      如果您不喜欢传递大量参数,您可以使用类来封装它们,或者这表明您应该对代码进行不同的分解。

      【讨论】:

      • 我同意:你不想无所事事地制作全局变量 - 它很混乱,不能很好地扩展并且不能与其他人一起玩(即:当你结合你的代码时和其他人')。但是它仍然有很好的用途,你不能忽视它。每次传参数都不行。
      【解决方案3】:

      如果您不知道,您可以执行以下操作:

      function foo() {
          global $fu, $bah;
          if (something()) {
              $fu->doSomething();
          } else {
              $bah->doSomething();
          }
      }
      

      您可以将两个全局变量放在同一行。甚至可能让它更快:)

      【讨论】:

        【解决方案4】:

        正如一氧化碳所说,没有显着的性能差异。

        但是,如果可能的话,我会避免使用 global;这是一条糟糕的路,你会吃意大利面。使用静态类;它会让事情变得更有条理。

        【讨论】:

        • 虽然我同意第一部分,但我看不出使用静态类有什么好处。应避免所有形式的全局变量。
        • 我使用 global 使 Main 对象在函数内部和脚本开头可用,就像我调用 require 或 include 一样。对于像 php.net/manual/en/function.imagecopyresized.php 这样本身已经有 10 个参数的函数来说,它变得更加简洁。在某些情况下,全局使它更干净,可以节省大量代码。此外,调用 global 可以通过引用使它们可用,您可以更改函数内部的变量值而无需返回(而不是 & 标记)。 Global 本来是用来……在某些情况下考虑
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-07
        • 2023-04-04
        • 2015-01-29
        • 2021-09-29
        • 1970-01-01
        • 2011-04-10
        • 1970-01-01
        相关资源
        最近更新 更多