为什么array_key_exists比引用数组上的isset慢1000倍?

问题描述

| 我发现在检查数组引用中是否设置了键时,
array_key_exists
比than1ѭ慢1000倍。有谁了解PHP的实现方式的人解释为什么这是真的吗? 编辑: 我添加了另一种情况,似乎表明它是使用引用调用函数所必需的开销。 基准示例
function isset_( $key,array $array )
{
    return isset( $array[$key] );
}

$my_array = array();
$start = microtime( TRUE );
for( $i = 1; $i < 10000; $i++ ) {
    array_key_exists( $i,$my_array );
    $my_array[$i] = 0;
}
$stop = microtime( TRUE );
print \"array_key_exists( \\$my_array ) \".($stop-$start).PHP_EOL;
unset( $my_array,$my_array_ref,$start,$stop,$i );

$my_array = array();
$start = microtime( TRUE );
for( $i = 1; $i < 10000; $i++ ) {
    isset( $my_array[$i] );
    $my_array[$i] = 0;
}
$stop = microtime( TRUE );
print \"isset( \\$my_array ) \".($stop-$start).PHP_EOL;
unset( $my_array,$i );

$my_array = array();
$start = microtime( TRUE );
for( $i = 1; $i < 10000; $i++ ) {
    isset_( $i,$my_array );
    $my_array[$i] = 0;
}
$stop = microtime( TRUE );
print \"isset_( \\$my_array ) \".($stop-$start).PHP_EOL;
unset( $my_array,$i );

$my_array = array();
$my_array_ref = &$my_array;
$start = microtime( TRUE );
for( $i = 1; $i < 10000; $i++ ) {
    array_key_exists( $i,$my_array_ref );
    $my_array_ref[$i] = 0;
}
$stop = microtime( TRUE );
print \"array_key_exists( \\$my_array_ref ) \".($stop-$start).PHP_EOL;
unset( $my_array,$i );

$my_array = array();
$my_array_ref = &$my_array;
$start = microtime( TRUE );
for( $i = 1; $i < 10000; $i++ ) {
    isset( $my_array_ref[$i] );
    $my_array_ref[$i] = 0;
}
$stop = microtime( TRUE );
print \"isset( \\$my_array_ref ) \".($stop-$start).PHP_EOL;
unset( $my_array,$i );

$my_array = array();
$my_array_ref = &$my_array;
$start = microtime( TRUE );
for( $i = 1; $i < 10000; $i++ ) {
    isset_( $i,$my_array_ref );
    $my_array_ref[$i] = 0;
}
$stop = microtime( TRUE );
print \"isset_( \\$my_array_ref ) \".($stop-$start).PHP_EOL;
unset( $my_array,$i );
输出量
array_key_exists( $my_array ) 0.0056459903717
isset( $my_array ) 0.00234198570251
isset_( $my_array ) 0.00539588928223
array_key_exists( $my_array_ref ) 3.64232587814 // <~ what on earth?
isset( $my_array_ref ) 0.00222992897034
isset_( $my_array_ref ) 4.12856411934 // <~ what on earth?
我使用的是PHP 5.3.6。 键盘示例。     

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)