5

快速代码(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
  }
}

非常慢的代码( 4000ms):(注意 $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');
}

现在又快了:(请注意这里已删除 is_array 检查)

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

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

现在我们将数组包装在一个对象中并重新引入 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');
}

这发生在 PHP 5.3 和 5.4 中。

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

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

注意:您可以将 is_array() 替换为 !is_object() 甚至 gettype() === 'array'。它没有一点改变。

4

0 回答 0