【问题标题】:Which is faster? Constants, Variables or Variable Arrays哪个更快?常量、变量或变量数组
【发布时间】:2011-12-07 15:58:06
【问题描述】:

我当前的 Web 应用程序使用大约 30 个 Contants (DEFINE())。我正在阅读变量更快的东西。如果有一个命名约定来避免变量覆盖,我看到的唯一另一个缺点是这些变量必须以某种方式在每个函数中定义为全局变量。

哪个更快?我在整个应用程序中大量使用这些常量,并且可能会永远在列表中添加更多常量,并且它们在函数和类中使用和使用。

【问题讨论】:

  • “过早的优化是万恶之源”。告诉我,如果你能衡量任何差异;)
  • 节省的时间太少了,根本不值得考虑。
  • 什么时候值得进行这种优化?每次引用常量时都会产生成本吗?这是否比引用变量时更多?这 30 个常量是每页上的 100 个引用。
  • 看起来您没有使用常量来实现它们的用途。一定不是问题,但我建议他们只给一些数字赋予像define('SECONDS_PER_HOUR', 3600); 这样的含义,而不是喜欢有配置值(我只假设你这样做,请不要冒犯)。优化更多是关于更改代码(并使其可测试)的速度,而不是执行速度。由于您概述的问题,计算机越快越有可能陷入执行速度瓶颈。
  • 我很确定差异不会是“小”而是不存在,看看 PHP 如何是一种解释性语言,变量或常量都需要解析、查找和它们的以同样的方式从 RAM 中获取值。这不像是有一个优化编译器(即使 PHP 确实翻译成某种字节码)可以在编译时消除常量计算。

标签: php performance optimization variables constants


【解决方案1】:

使用define() 定义的常量在PHP 中相当慢。人们实际上编写了扩展(如hidef)来提高性能。

但除非你有大量的常量,否则这应该不会有太大的不同。

从 PHP 5.3 开始,您还可以使用 const NAME = VALUE; 来使用编译时常量。这些要快得多。

【讨论】:

  • 您对负载的定义是什么?我有大约 30 个,每页被引用 100 次
  • @David 30 并不多。只有数百个常量才会出现问题。
【解决方案2】:

差异会非常小(微优化)。您最好将一些常量封装在类中,这样您就可以通过Classname::CONSTANT 访问它们,以免污染应用程序的全局命名空间。

【讨论】:

    【解决方案3】:

    快速测试表明,定义常量 (define('FOO', 'bar');) 比定义变量 ($foo = 'bar';) 慢大约 16 到 18 倍,但使用定义的(常量)值大约快 4 到 6 倍。

    【讨论】:

      【解决方案4】:

      我对@9​​87654321@ 和variables 进行了基准测试,发现使用variables 比使用constants 时性能有了显着提高。我知道这很明显,但绝对值得考虑尽可能使用局部变量而不是常量。

      如果constantsloops 中使用了多次,那么绝对值得将常量声明为类/局部变量并改用它。

      基准测试用例包括创建两个函数。每个都有一个循环执行10000000 次。一种访问在常量文件中声明的常量,另一种访问局部变量。

      TestConstants.php

      class TestConstants 
      {   
          const TEST_CONSTANT = 'This is a constant value';
      
      }
      

      Test.php

      use TestConstants;
      
      class Test {
      
          protected $TEST_CONSTANT;
          protected $limit = 10000000;
          function __construct() {
              $this->TEST_CONSTANT = 'This is a constant value';
          }
      
          function testA() {
              $limit = $this->limit;
              $time_start = microtime(true); 
              for ($i = 0; $i < $limit; ++$i) {
                  TestConstants::TEST_CONSTANT;
              }
              $time_end = microtime(true);
              $execution_time = ($time_end - $time_start);
              echo ''. $execution_time .' seconds <br/>';
          }
      
          function testB() {
              $limit = $this->limit;
              $time_start = microtime(true); 
              for ($i = 0; $i < $limit; ++$i) {
                  $this->TEST_CONSTANT;
              }
              $time_end = microtime(true);
              $execution_time = ($time_end - $time_start);
              echo ''. $execution_time .' seconds <br/>';
          }   
      }
      
      $test = new Test();
      $test->testA();
      $test->testB();
      

      结果如下

      testA() 执行时间为 0.55921387672424 秒

      testB() 在 0.33076691627502 秒内执行

      PHP 版本

      5.6.30

      我想与其他人分享这一点可能会受益于避免直接调用constants(尤其是内部循环),在适用的情况下将它们声明为variables

      谢谢。

      【讨论】:

        【解决方案5】:

        我也无法想象任何速度差异都会产生影响。可以肯定的是,在许多情况下,变量比常量更容易使用。

        但是,您真正的问题似乎是您有一堆配置数据,并且您希望避免将大量变量传递给函数,或者必须将它们全部设为全局。

        没有一个适合所有人的答案,但一种流行的解决方案是使用注册表类或自己创建一个。通过声明一个 php 数组,您可以很容易地做到这一点。然后初始化注册表对象,您的函数和类通过静态方法调用访问它。我不会为您提供 sn-ps,而是将zend_configzend_registry 作为示例。虽然 ZF 提供了这些,但您不应该害怕推出自己的版本,因为如果您想避免在项目中使用 ZF,那么以更简单的形式重新创建这两种版本都不是特别困难。

        【讨论】:

          【解决方案6】:
          猜你喜欢
          • 2011-08-28
          • 2022-09-27
          • 2015-11-03
          • 2011-03-30
          • 1970-01-01
          • 2014-07-15
          • 1970-01-01
          • 2017-04-27
          • 1970-01-01
          相关资源
          最近更新 更多