php - temp变量v数组索引

时间:2015-12-18 12:33:40

标签: php arrays variables

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

$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 个答案:

答案 0 :(得分:1)

http://sandbox.onlinephpfunctions.com/code/c5acd07edcc910bfdd80a27bee0583d8540e17e3

这是100000次的结果:

First: 0.0018520355224609 with a pointer to the actual value

Second: 0.003324031829834 with a pointer to the array

就像你可以看到有一个很大的不同,但现在计算机要快速,甚至让你的时间值得担心它。

答案 1 :(得分:0)

这完全取决于你的意图。如果您只读过它,那就没有功能差异。如果你这个值,那么可能会有功能差异。

假设在您的情况下没有功能差异,阵列访问应该比直接变量访问稍微贵一些。 然而 ,这并不意味着你应该向后弯腰以针对这种情况进行优化。性能上的差异将是如此微小,以至于在现实世界的应用中难以测量。因此,可读性应该是您唯一的决定因素。

答案 2 :(得分: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

但由于寄存器的使用,这可能因代码大小而异。