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