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().它没有改变.
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |