【问题标题】:php - temp variable v array indexphp - 临时变量 v 数组索引
【发布时间】:2016-03-25 04:12:00
【问题描述】:

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

$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']

【问题讨论】:

  • $myArray['value1'] 在这里不起作用,因为 value_1 是一个值,而不是一个键。此外,还有第三种可能:您可以在数组条目上添加引用:$value1 =& $myArray['key_1'];
  • 第一个例子中只保留了$myArray['value_1']的初始值,而在第二个例子中修改了它。这是一个不同的用例。
  • 对不起,我在问题中犯了一个错误并更正了它
  • 我认为每次直接使用$myArray['value_1'] 时,PHP 的查找时间都会减少。直接使用时必须在数组中查找,否则必须在变量中查找值?

标签: php arrays variables


【解决方案1】:

使用 命名键数字键 比使用 标量变量 慢很多:

<?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

但这可能会因寄存器使用情况而因代码大小而异。

【讨论】:

    【解决方案2】:

    这完全取决于您的意图。如果您只阅读它,则没有功能差异。如果您也写入该值,则可能会有功能差异。

    假设在您的情况下没有功能差异,数组访问应该比直接变量访问稍微贵一些。 但是,这并不意味着您应该向后弯腰来优化这种情况。性能差异非常小,以至于在现实世界的应用程序中几乎无法测量。所以可读性应该是你唯一的决定因素。

    【讨论】:

      【解决方案3】:

      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
      

      正如您所看到的那样,有很大的不同,但现在计算机速度很快,甚至值得您花时间担心。

      【讨论】:

      • 相对而言“大”,在实际 CPU 时间中几乎不存在;特别是考虑到您可能不会在实际应用程序中紧密循环地执行此操作 100000 次...
      • 这是一个微优化。你需要一个紧密的环来测量它。
      • 没有理由不说话^^。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 2017-05-22
      • 2013-01-13
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      相关资源
      最近更新 更多