21,887
社区成员
发帖
与我相关
我的任务
分享
set_time_limit(0);
$arr = array();//测试数组
$arrLength = 5000;//测试数组长度
$arrType = 2;//1是1—1亿随机数字,2是8位字符串,3是32位字符串
$cycleTimes = 100;//测试次数,尽量避免偶然情况
$searchTimes = 50;//查找次数实际是50*2,50个能找到,50个找不到
$keywordArr = array();//要比对的元素,数组形式保存
$resultArr = array();//记录测试结果的数组
/**
* 构造数组元素
*
* @access public
* @param integer $arrType 元素类型
* @param bool $flag 为了构造差异元素
* @return string
*/
function creatItem($arrType = 1, $flag = true)
{
$item = '';
$seed = $flag ? rand(1, 50000000) : rand(50000001, 100000000);
switch($arrType)
{
case 1:
$item = $seed;
break;
case 2:
$item = sprintf('%X', crc32($seed));
break;
default:
$item = md5($seed);
}
return $item;
}
//测试数组赋值,同时保存$searchTimes个能找到的元素
for($i=0;$i<$arrLength;$i++)
{
$arr[] = creatItem($arrType, true);
if($i < $searchTimes)
{
$keywordArr[] = $arr[$i];
}
}
//构造$searchTimes个测试数组中没有的值
for($i=0;$i<$searchTimes;$i++)
{
$keywordArr[] = creatItem($arrType, false);
}
/*********************初始化结束*****************/
//每种方法测,都用到shuffle,所以这里顺便测试一下效率
$timeStart = gettimeofday();
for($i=0;$i<$cycleTimes;$i++)
{
shuffle($arr);
}
$resultArr['shuffle'] = gettimeofday();
//开始循环测试foreach
for($i=0;$i<$cycleTimes;$i++)
{
shuffle($arr);
foreach($keywordArr AS $v)
{
foreach($arr AS $value)
{
if($value == $v)
{
break;
}
}
}
}
$resultArr['foreach'] = gettimeofday();
//开始循环测试in_array
for($i=0;$i<$cycleTimes;$i++)
{
shuffle($arr);
foreach($keywordArr AS $v)
{
in_array($v, $arr);
}
}
$resultArr['in_array'] = gettimeofday();
//开始循环测试array_search
for($i=0;$i<$cycleTimes;$i++)
{
shuffle($arr);
foreach($keywordArr AS $v)
{
array_search($v, $arr);
}
}
$resultArr['array_search'] = gettimeofday();
//开始循环测试strpos
for($i=0;$i<$cycleTimes;$i++)
{
shuffle($arr);
$arraystring = ',' . implode(',', $arr) . ',';
foreach($keywordArr AS $v)
{
strpos($arraystring, ',' . $v . ',');
}
}
$resultArr['strpos'] = gettimeofday();
//开始循环测试array_key_exists
for($i=0;$i<$cycleTimes;$i++)
{
shuffle($arr);
$arr = array_flip($arr);
foreach($keywordArr AS $v)
{
array_key_exists($v, $arr);
}
}
$resultArr['array_key_exists'] = gettimeofday();
//开始循环测试isset($arr[$key])
for($i=0;$i<$cycleTimes;$i++)
{
shuffle($arr);
$arr = array_flip($arr);
foreach($keywordArr AS $v)
{
isset($arr[$v]);
}
}
$resultArr['isset_key'] = gettimeofday();
//打印结果
echo var_dump($arrLength, $arrType, $cycleTimes, $searchTimes) . '<br />';
foreach($resultArr AS $k => $v)
{
$time = ($v["usec"]-$timeStart["usec"])/1000000+$v["sec"]-$timeStart["sec"];
$time = round($time, 6)."秒";
echo $time . ' ' . $k . '<br />';
$timeStart = $v;
}
...
//测试数组赋值,同时保存$searchTimes个能找到的元素
for($i=0;$i<$arrLength;$i++)
{
$arr[$i] = $rvalue = creatItem($arrType, true);
$hash[$rvalue][] = $i;//...
if($i < $searchTimes)
{
$keywordArr[] = $arr[$i];
}
}
..
for($i=0;$i<$cycleTimes;$i++)
{
shuffle($arr);
foreach($keywordArr AS $v) isset($hash[$v]);
}
$resultArr['hash'] = gettimeofday();