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

     2023-03-05     49

关键词:

【中文标题】哪个更快?常量、变量或变量数组【英文标题】: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中单引号和双引号的区别,哪个速度更快?为啥?

参考技术A  单引号更快。  1.在php中,单引号内的数据不会被解析(任何变量和特殊转义字符),所以速度更快,而双引号内的数据会被解析,如变量($var)值会代入字符串中,特殊转义字符也会被解析成特定的单个字,  2.... 查看详情

c语言中,定义数组和引用数组时,其数组的下标的数据类型分别允许是啥?

1、C89/C90标准:定义数组时下标只允许使用整型、字符型常量,引用数组时下标可以使用整型、字符型的常量或者变量2、C99标准:定义数组时下标可以使用整型、字符型的常量或变量,但变量必须已经赋值;引用数组时下标可以... 查看详情

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

】单个对象数组或多个数据属性数组哪个更快?[关闭]【英文标题】:whichisfaster,asinglearrayofobject,ormultiplearrayofdataattributes?[closed]【发布时间】:2014-03-0410:28:18【问题描述】:这是一个简化的例子。请注意,我选择了简单类型,但... 查看详情

c语言指针

...运算时候的顺序严格地说,一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。为了避免混淆,我们中约定:“指针”是指地址,是常量,“指针变量”是指取... 查看详情

第六章数组与结构

...合一.一维数组  1.格式:类型说明符  数组名[常量表达式]    例如:  intarr[1,2,3,4,5,6]    格式说明:(1)数组中的每一个变量称为数组元素       (2)数组在内存中存储是占一段连续的存储... 查看详情

哪个更快/更高效——大量的小 MySQL 查询或一个大的 PHP 数组?

】哪个更快/更高效——大量的小MySQL查询或一个大的PHP数组?【英文标题】:Whichisfaster/moreefficient-lotsoflittleMySQLqueriesoronebigPHParray?【发布时间】:2012-08-1614:10:11【问题描述】:我有一个基于PHP/MySQL的Web应用程序,它通过名为langua... 查看详情

“变量不能用作常量”c ++数组[重复]

】“变量不能用作常量”c++数组[重复]【英文标题】:"Variablecannotbeusedasaconstant"c++array[duplicate]【发布时间】:2020-12-1214:08:57【问题描述】:我正在努力使用C++。我以前学过Java,我认为它更容易,tbh。目前,我正在尝试用c... 查看详情

c语言num意思

...组类型、结构体类型、共用体类型、指针类型和空类型。常量与变量:常量其值不可改变,符号常量名通常用大写。变量是以某标识符为名字,其值可以改变的量。标识符是以字母或下划线开头的一串由字母、数字或下划线构成... 查看详情

indexOfObjectsPassingTest 或 filteredArrayUsingPredicate 哪个性能更快?

】indexOfObjectsPassingTest或filteredArrayUsingPredicate哪个性能更快?【英文标题】:WhichhasfasterperformanceindexesOfObjectsPassingTestorfilteredArrayUsingPredicate?【发布时间】:2014-02-0502:01:04【问题描述】:当需要过滤NSArray以获取返回的数组中项目的... 查看详情

c语言中num是啥意思

...组类型、结构体类型、共用体类型、指针类型和空类型。常量与变量:常量其值不可改变,符号常量名通常用大写。变量是以某标识符为名字,其值可以改变的量。标识符是以字母或下划线开头的一串由字母、数字或下划线构成... 查看详情

c语言中,该怎样区分指针常量和指针变量?

...uot;DEF";这样以后,书上说s1就是指针变量,s2就是指针常量,可以做strcpy(s1,s2),但不能做strcpy(s2,s1)。为什么啊?不是说所有的数组名都是指针常量吗?那s1不就是个字符数组名吗,怎么会是变量呢?还有,定义char*s2以后,我觉... 查看详情

js变量及常量

一、变量1、声明变量时不用声明变量类型.全都使用var关键字;vara;<br>a=3;2、一行可以声明多个变量.并且可以是不同类型varname="yuan",age=20,job="lecturer";3、声明变量时可以不用var.如果不用var那么它是全局变量4、变量命名,首字符... 查看详情

c语言中num啥意思

...组类型、结构体类型、共用体类型、指针类型和空类型。常量与变量:常量其值不可改变,符号常量名通常用大写。变量是以某标识符为名字,其值可以改变的量。标识符是以字母或下划线开头的一串由字母、数字或下划线构成... 查看详情

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

请问下面赋值有什么问题,为什么会有Incompatibletypes错误呢?procedureTForm1.FormCreate(Sender:TObject);consta:array[0..3]ofchar=(#1,#1,#1,#1);varb:array[0..3]ofchar;beginb:=a;//Incompatibletypesend;delphi(pascal)本身不支持高级别的矩阵运算,只能对矩阵或数... 查看详情

c语言怎样区分指针常量和指针变量?

...har*s2="DEF";这样以后,s1就是指针变量,s2就是指针常量吗?为什么?不是说所有的数组名都是指针常量吗?那s1不就是个字符数组名吗,怎么会是变量呢?还有,定义char*s2以后,我觉得s2应该是指针变量啊,怎么会说他是指... 查看详情

php中变量和数组的速度

...道的是,我知道它们都保存在内存中,但哪种方法更小/更快,创建一些变量或使用变量的键和值创建一个数组以下是一些示例:$apples= 查看详情

类变量实例变量常量运算符(代码片段)

类变量实例变量常量publicclassHello//类名首字母要大写(Hello)staticdoublesalary=2500;//类变量,,有static(静态)的//变量由变量类型变量名(小写或驼峰原则)=变量值组成//常量由final变量类型变量名(英文大写)=变量值组成(常量是... 查看详情

PHP,静态变量或私有变量哪个更好?

】PHP,静态变量或私有变量哪个更好?【英文标题】:WhichisbetterinPHP,StaticVariableorPrivateVariable?【发布时间】:2011-08-2811:39:26【问题描述】:我注意到PHP中有两种方法可以做同样的事情。你能告诉我哪种方式是更好的编程习惯吗?... 查看详情