哪个更快?常量、变量或变量数组

Posted

技术标签:

【中文标题】哪个更快?常量、变量或变量数组【英文标题】: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 确实翻译成某种字节码)可以在编译时消除常量计算。 【参考方案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_config 和zend_registry 作为示例。虽然 ZF 提供了这些,但您不应该害怕推出自己的版本,因为如果您想避免在项目中使用 ZF,那么以更简单的形式重新创建这两种版本都不是特别困难。

【讨论】:

【参考方案6】:

这些基准测试的结果仍然成立;变量比define()const 都快: http://planetozh.com/blog/2006/06/php-variables-vs-constants

http://www.joomlaperformance.com/articles/performance/52_php_programming_tips_43_13_2.html

【讨论】:

以上是关于哪个更快?常量、变量或变量数组的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 许多变量或一个数组?

delphi 常量数组赋值给变量数组

php第二节(变量常量)

foreach用法

单个对象数组或多个数据属性数组哪个更快? [关闭]

数组与文字处理