PHP中的数组测试的性能问题.为什么?

Ser*_*gio 5 php arrays performance pass-by-reference

快速代码(100ms):

// Mixed could theoretically be an object or an array. 
// In this example it's an array.
$mixed = array();
for($i = 0; $i < 10000; $i++) {
  if (is_array($mixed)) {
    $mixed[getRandomStr(15)] = 'abcd';
  } else {
    // Do something else which we don't care about here
  }
}
Run Code Online (Sandbox Code Playgroud)

非常慢的代码(4000毫秒):(注意$ mixed通过引用传递)

function put(&$mixed, $key, $value) {
  if (is_array($mixed)) {
    $mixed[$key] = $value;
  } else {
    // Do something else which we don't care about here
  }
}

$mixed = array();
for($i = 0; $i < 10000; $i++) {
  put($mixed, getRandomStr(15), 'abcd');
}
Run Code Online (Sandbox Code Playgroud)

现在又快了:(请注意,此处已删除了is_array检查)

function put(&$mixed, $key, $value) {
  $mixed[$key] = $value;
}

$mixed = array();
for($i = 0; $i < 10000; $i++) {
  put($mixed, getRandomStr(15), 'abcd');
}
Run Code Online (Sandbox Code Playgroud)

现在我们将数组包装在一个对象中并重新引入is_array检查...它仍然很快:

function put($objWrap, $key, $value) {
  if (is_array($objWrap->mixed)) {
    $objWrap->mixed[$key] = $value;
  } else {
    // Do something else which we don't care about here
  }
}

$objWrap = new stdClass;
$objWrap->mixed = array();

for($i = 0; $i < 10000; $i++) {
  put($objWrap, getRandomStr(15), 'abcd');
}
Run Code Online (Sandbox Code Playgroud)

这种情况发生在PHP 5.3和5.4中.

有谁知道为什么?(和/或如何解决此问题)

我的猜测:将对数组的引用传递给is_array()会导致整个数组被复制,从而减慢进程.

注意:您可以使用!is_object()或使用gettype()==='array'替换is_array().它没有改变.