PHP-在关联数组中存储单个项是否比基本变量存储性能更好/更差?

PHP-在关联数组中存储单个项是否比基本变量存储性能更好/更差?,php,arrays,variables,Php,Arrays,Variables,假设我有一根绳子'iAmSomeRandomString'。假设我选择以两种方式存储此字符串: $stringVar='iAmSomeRandomString' $stringArr=array('rando'=>'iAmSomeRandomString') 如果我以后想访问该字符串,是否使用$stringVar或$stringArr['rando']更有效 我的理解是没有表现上的差异,但我在一次采访中被问到这一点,并告诉我错了。所以现在我想知道发生了什么事 $stringVar = 'iAm

假设我有一根绳子<代码>'iAmSomeRandomString'。假设我选择以两种方式存储此字符串:

  • $stringVar='iAmSomeRandomString'
  • $stringArr=array('rando'=>'iAmSomeRandomString')
  • 如果我以后想访问该字符串,是否使用
    $stringVar
    $stringArr['rando']
    更有效


    我的理解是没有表现上的差异,但我在一次采访中被问到这一点,并告诉我错了。所以现在我想知道发生了什么事

     $stringVar = 'iAmSomeRandomString';
    
    总内存使用量为179336

    $stringArr = array('rando' => 'iAmSomeRandomString');
    
    总内存使用量为179616

    根据内存,当数组中只有一个元素时,最好使用基本变量

    总内存使用量为179336

    $stringArr = array('rando' => 'iAmSomeRandomString');
    
    总内存使用量为179616

    根据内存,当数组中只有一个元素时,最好使用基本变量


    很明显,第一种情况(将值保存在各个变量中)使用的内存更少,访问时间也更短

    数组本身就是一个变量,除了保存其内容所需的内存外,它还使用内存进行簿记。存储在数组中的项保存在链表中,以允许顺序访问(
    foreach
    ),还有一个允许直接访问元素的映射($array[$index])

    所有这些内部数据结构都使用内存,并且随着阵列的增长而增长(阵列的内存开销不是恒定的)

    关于访问数据所需的时间,数组引入了一个补充级别的间接寻址。访问简单字符串变量需要在当前符号表中查找其名称,然后才能访问其内容。使用数组时,操作会发生两次:查找数组变量及其内容,然后在数组中查找所需的值


    但是,对于大多数脚本来说,内存消耗和访问时间的差异并不显著,因此不值得尝试以这种方式优化任何内容。

    很明显,第一种情况(将值保留在各个变量中)使用的内存更少,访问所需的时间也更少

    数组本身就是一个变量,除了保存其内容所需的内存外,它还使用内存进行簿记。存储在数组中的项保存在链表中,以允许顺序访问(
    foreach
    ),还有一个允许直接访问元素的映射($array[$index])

    所有这些内部数据结构都使用内存,并且随着阵列的增长而增长(阵列的内存开销不是恒定的)

    关于访问数据所需的时间,数组引入了一个补充级别的间接寻址。访问简单字符串变量需要在当前符号表中查找其名称,然后才能访问其内容。使用数组时,操作会发生两次:查找数组变量及其内容,然后在数组中查找所需的值


    但是,对于大多数脚本来说,内存消耗和访问时间的差异并不显著,因此不值得尝试以这种方式优化任何内容。

    第一种情况将消耗更少的内存,并且速度更快。但差别是如此之小,以至于在大多数情况下都无关紧要。不过,是的,技术上他们是对的

        $time_start=microtime(true);
    for ($i=0; $i < 100000; $i++)
    {
        $stringVar=1;
        $stringVar++;
    }
    $time_end=microtime(true);
    echo (microtime(true) - $time_start);
    
    $time\u start=microtime(真);
    对于($i=0;$i<100000;$i++)
    {
    $stringVar=1;
    $stringVar++;
    }
    $time\U end=微时间(真);
    echo(microtime(true)-$time\u start);
    
    将输出0.0034611225128174

    $time\u start=microtime(真);
    对于($i=0;$i<100000;$i++)
    {
    $stringArr=数组('rando'=>1);
    $stringArr['rando']++;
    }
    $time\U end=微时间(真);
    echo(microtime(true)-$time\u start);
    
    将输出0.017335176467896


    第一种情况将消耗更少的内存,速度更快。但差别是如此之小,以至于在大多数情况下都无关紧要。不过,是的,技术上他们是对的

        $time_start=microtime(true);
    for ($i=0; $i < 100000; $i++)
    {
        $stringVar=1;
        $stringVar++;
    }
    $time_end=microtime(true);
    echo (microtime(true) - $time_start);
    
    $time\u start=microtime(真);
    对于($i=0;$i<100000;$i++)
    {
    $stringVar=1;
    $stringVar++;
    }
    $time\U end=微时间(真);
    echo(microtime(true)-$time\u start);
    
    将输出0.0034611225128174

    $time\u start=microtime(真);
    对于($i=0;$i<100000;$i++)
    {
    $stringArr=数组('rando'=>1);
    $stringArr['rando']++;
    }
    $time\U end=微时间(真);
    echo(microtime(true)-$time\u start);
    
    将输出0.017335176467896


    是否存在相关的性能差异?没有

    请注意,您会看到不同版本的数字有所不同,但高度取决于它们运行的位置。您可能无法比较两个版本

    还要注意,我在测量之前就开始了文本输出,这是因为如果没有它,您将测量PHP准备输出时的性能损失,这在本测试中是一个相关的影响

    你的问题与面试情况有关。虽然事后判断什么是更好的答案总是比较容易,但我仍然想强调,变量的存储方式并不重要。更重要的因素应该是您编写的代码是否可读,以及您阅读的代码是否被理解

    由于性能原因,如果值被保证为单个值,那么将值存储到数组中是没有意义的。将其存储到数组中告诉我将有更多的值。如果我没有立即看到它们被添加到哪里,我将开始搜索它们,因为如果我需要更改数组中的某些内容,我不想使用在其他地方使用的密钥

    此外,问题的目标是简单的全局变量。我认为适当的应用程序设计将使用对象。他们为什么不询问类属性?为什么他们不询问静态和动态特性及其性能
    Output for 5.5.2, 5.5.25, 5.6.10, 7.0.4
    iAmSomeRandomStringiAmSomeRandomString
       First case: 0.000031
      Second case: 0.000004
    
    Output for 7.0.3
    iAmSomeRandomStringiAmSomeRandomString
       First case: 0.000127
      Second case: 0.000017