PHP - 临时变量与数组索引

3

除了可读性之外,以下两个示例有哪些优缺点?第一个示例每次使用时都将使用数组索引访问值,而第二个示例将分配给临时变量,然后只需使用该变量。

$myArray = ['value_1' => 'value 1', 'value_2'  => 'value 2', 'value_3'  => 'value 3'];
$value1 = $myArray['value_1'];        
// Do lots of things with $value1

对比

$myArray = ['value_1' => 'value 1', 'value_2'  => 'value 2', 'value_3'  => 'value 3'];
// Do lots of things with $myArray['value1']

3
$myArray['value1'] 在这里无法使用,因为 value_1 是一个值,不是一个键。此外,还有第三种可能性:您可以在数组条目上放置引用:$value1 =& $myArray['key_1']; - syck
1
只有在第一个示例中维护了$myArray['value_1']的初始值,而在第二个示例中对其进行了修改。这是不同的用例。 - Sablefoste
抱歉,我在问题中犯了一个错误并进行了更正。 - Marty Wallace
我认为,如果每次直接使用$myArray['value_1'],PHP的查找时间会更短。当直接使用时,它必须在数组内查找,否则它必须在变量中查找该值? - Yoram de Langen
3个回答

1

1
从相对角度来看,“大”在实际CPU时间上几乎不存在;特别是考虑到您在实际应用程序中可能不会在紧密循环中执行此操作100000次... - deceze
这是微观优化。你需要一个紧密的循环来测量它。 - Karoly Horvath
1
没有理由不相对地交流 ^^。 - jermey

0

使用命名键比使用数字键慢得多,比使用标量变量还要慢:

<?php

$myArray = ['value_1' => 'value 1', 'value_2'  => 'value 2', 'value_3'  => 'value 3'];
$myArray2 = ['value 1', 'value 2', 'value 3'];

$tt = microtime(true);
for ($i = 0; $i<1e7; $i++) $x = $myArray['value_1'];
$dt = microtime(true)-$tt;
echo $dt.PHP_EOL;

$tt = microtime(true);
for ($i = 0; $i<1e7; $i++) $x = $myArray2[0];
$dt = microtime(true)-$tt;
echo $dt.PHP_EOL;

$tt = microtime(true);
$y = $myArray['value_1'];
for ($i = 0; $i<1e7; $i++) $x = $y;
$dt = microtime(true)-$tt;
echo $dt.PHP_EOL;

?>

给出:

0.80559897422791  // named key
0.74200701713562  // numeric key
0.54049301147461  // scalar

在循环中多次解引用数组,并且迭代次数很多,因此可能会很昂贵。但这主要适用于数字计算和类似的东西,在这方面 PHP 基本上不是最佳选择,因为它并不是为此设计的。
编辑有趣的是,在 Xeon 处理器上,从变量分配整数值比从标量整数分配快约 10-20%,而在 Intel i5 机器上没有区别。代码here 给出了 Xeon 盒子的以下结果:
Accessing associative array                                 0.900
Accessing numerical array                                   0.794
Assigning from reference to associative array               0.662
Assigning a reference to an associative array element       0.877
Assigning scalar variable                                   0.499
Assigning scalar string                                     0.659
Assigning scalar integer                                    0.562

但这可能会因为寄存器使用而有所不同,取决于代码的大小。


0

这完全取决于你的意图。如果你只是从中读取,那么没有功能上的区别。如果你也要对该值进行写入,那么可能会有功能上的区别。

假设在你的情况下没有功能上的区别,那么数组访问应该比直接变量访问稍微昂贵一些。然而,这并不意味着你应该为了优化这种情况而费尽心思。在实际应用中,性能差异如此微小,以至于几乎无法测量。因此,可读性应该是你唯一的决定因素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接