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

时间:2011-10-14 10:41:02

标签: php performance optimization variables constants

我当前的Web应用程序使用大约30个左右的Contants(DEFINE())。我正在读变量更快的东西。如果存在一个避免变量覆盖的命名约定,那么我看到的唯一其他缺点就是这些变量必须被定义为全局变量,而不是每个函数中的变量。

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

6 个答案:

答案 0 :(得分:23)

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

但除非你有很多常数,否则这应该没什么区别。

从PHP 5.3起,您还可以使用const NAME = VALUE;使用编译时常量。那些更快。

答案 1 :(得分:11)

差别很小(微优化)。您最好在类中封装一些常量,以便Classname::CONSTANT访问它们,以免污染应用程序的全局命名空间。

答案 2 :(得分:8)

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

答案 3 :(得分:0)

答案 4 :(得分:0)

我对constantsvariables进行了基准测试,发现与variables相比,使用constants的性能有了显着提高。我知道这很明显,但是绝对值得在可能的情况下使用局部变量而不是常量。

如果constants内使用了loops次,那么绝对值得将常量声明为类/局部变量,而应使用它。

基准测试用例包括创建两个函数。每个循环都有一个执行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 :(得分:-1)

我也无法想象任何速度差异都是重要的。当然,在许多情况下,变量比常量更容易使用。

然而,似乎你真正的问题是你有一堆配置数据,你想避免必须将大量的变量传递给函数,或者必须使它们全局化。

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