最近阅读了PHP数组相关实现原理的文章, 因为是hashTable+链表的形式实现, 所以想用代码具体看一下对性能的影响,
测试了2,3组数据,不太满意, 就不贴出来分析了, 先贴代码, 后续还需要修改测试代码画曲线图来分析
说一下测试目的, 一个例子是通过取值来说明PHP数组是通过链表遍历来进行随机访问的,性能和foreach应该差不多(事实说明前者快很多,可能是底层优化过), 第二个例子是说明foreach是链表遍历,for是随机访问的遍历,前者性能高于后者,这个测试结果与猜测相符.
function getValueTest(){
//生成测试样本数组
require_once '../../include/Timer.cls.php';
$arr = array();
$n = 10000;
for ($i=1;$i<=$n;$i++){
$value = 'a'.$i;
$arr[$value] = $value;
}
$Timer = new Timer();
$tmp = '';
//比较取值的性能差异
//通过索引取值
$Timer->start();
for ($i=$n;$i>0;$i--){
$value = 'a'.$i;
$tmp = $arr[$value];
}
$Timer->stop();
$time1 = $Timer->getTime();
//通过遍历比较取值
$Timer->start();
for ($i=$n;$i>0;$i--){
$value = 'a'.$i;
foreach ($arr as $key => &$val){
if ($val == $value){
$tmp = $val;
break;
}
}
}
$Timer->stop();
$time2 = $Timer->getTime();
unset($val);
echo "time1 $time1 time2 $time2";
}
function compareWhile(){
//生成测试样本数组
require_once '../../include/Timer.cls.php';
$arr = array();
$n = 1000000;
for ($i=$n;$i>0;$i--){
$arr[$i] = $i;
}
$tmp = '';
//遍历性能比较
$Timer = new Timer();
$Timer->start();
for ($i=1;$i<=$n;$i++){
$tmp = $arr[$i];
}
$Timer->stop();
$time1 = $Timer->getTime();
$Timer->start();
foreach ($arr as $key => &$val){
$tmp = $val;
}
$Timer->stop();
$time2 = $Timer->getTime();
unset($val);
echo "time1 $time1 time2 $time2";
}