我当前的 Web 应用程序使用大约 30 个左右的 Contants (DEFINE())。我正在读一些变量更快的东西。假设有一个命名约定来避免变量覆盖,我看到的唯一另一个缺点是这些变量必须在每个函数中以某种方式定义为全局变量。
哪个更快?我在整个应用程序中大量使用这些常量,并且可能会永远向列表中添加更多常量,它们在函数和类中和函数和类之外使用。
使用
define()
定义的常量在 PHP 中相当慢。人们实际上编写了扩展(如 hidef)来提高性能。
但是除非你有大量常量,否则这应该不会产生太大的影响。
从 PHP 5.3 开始,您还可以使用
const NAME = VALUE;
使用编译时常量。这些要快得多。
差异非常小(微观优化)。您最好将一些常量封装在类中,以便您可以通过
Classname::CONSTANT
访问它们,以免污染应用程序的全局命名空间。
快速测试表明,定义常量 (
define('FOO', 'bar');
) 比定义变量 ($foo = 'bar';
) 慢约 16 至 18 倍,但使用定义的(常量)值约快 4 至 6 倍。
我对
constants
与 variables
进行了基准测试,发现使用 variables
比使用 constants
时性能有显着提高。我知道这是非常明显的,但绝对值得考虑尽可能使用局部变量而不是常量。
如果
constants
在 loops
内部使用了多次,那么绝对值得将常量声明为类/局部变量并使用它。
基准测试用例包括创建两个函数。每个都有一个执行
10000000
次的循环。一种访问常量文件中声明的常量,另一种访问局部变量。
测试常量.php
class TestConstants
{
const TEST_CONSTANT = 'This is a constant value';
}
测试.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
(尤其是内部循环),可能会受益。
谢谢你。
我也无法想象任何速度差异都会产生后果。确实,在许多情况下,变量比常量更容易使用。
然而,您真正的问题似乎是您有一堆配置数据,并且您希望避免将大量变量传递给函数,或者必须使它们全部全局。
没有一个答案适合所有人,但一种流行的解决方案是使用注册表类或自己创建一个。您可以通过声明一个 php 数组轻松地做到这一点。然后初始化注册表对象,并且您的函数和类通过静态方法调用访问它。我不会向您提供代码片段,而是仅以 zend_config 和 zend_registry 作为示例。虽然 ZF 提供了这些,但您不应该害怕推出自己的版本,因为如果您想避免在项目中使用 ZF,那么以更简单的形式重新创建这两个版本都不是特别困难。
我建议将所有这些值放入 $_SESSION 变量中。
然后它们可用于您应用程序中的所有例程。
郑重声明,PHP 8.1 x64 Windows。
const A1=[1,2,3,4];
$a1=[1,2,3,4];
$t1=microtime(true);
for($i=0;$i<1000000;$i++) {
$d=A1[1];
}
$t2=microtime(true);
echo $t2-$t1."\n";
$t1=microtime(true);
for($i=0;$i<1000000;$i++) {
$d=$a1[1];
}
$t2=microtime(true);
echo $t2-$t1."\n";
结果(以秒为单位)
恕我直言:也许常量的定义涉及到在某些内部字典中的查找。