php 如何高效循环 最好不要频繁操作函数 传来的引用参数最好有个中间值(总是反复读写内存)
function buildData(int $len)
{
$ret = [];
if($len>0)
{
$ret['len'] = $len;
for($i=0;$i<$len;$i++)
{
$ret['data'][] = mt_rand(1,2);
}
}
return $ret;
}
define("IDENT",1);
define("OP",'*');
function a1(array $v,&$dest)
{
$dest = IDENT;
for($i=0;$i<getLen($v);$i++)
{
$data = getVal($v);
$dest = $dest * $data[$i];
}
}
function a2(array $v,&$dest)
{
$len = getLen($v);
$dest = IDENT;
for($i=0;$i<$len;$i++)
{
$data = getVal($v);
$dest = $dest * $data[$i];
}
}
function a3(array $v,&$dest)
{
$len = getLen($v);
$data = getVal($v);
$dest = IDENT;
for($i=0;$i<$len;$i++)
{
$dest = $dest * $data[$i];
}
}
function a4(array $v,&$dest)
{
$len = getLen($v);
$data = getVal($v);
$acc = IDENT;
for($i=0;$i<$len;$i++)
{
$acc = $acc * $data[$i];
}
$dest = $acc;
}
//2*1
function a5(array $v,&$dest)
{
$len = getLen($v);
$data = getVal($v);
$acc = IDENT;
$limit = $len - 1;
for($i=0;$i<$limit;$i+=2)
{
$acc = $acc * $data[$i] * $data[$i+1];
}
//还需要循环 1+2 或者 1+1次
for(;$i<$len;$i++)
{
$acc = $acc * $data[i];
}
$dest = $acc;
}
//2*2 并行执行 必须支持多线程
function a6(array $v,&$dest)
{
$len = getLen($v);
$data = getVal($v);
$acc0 = IDENT;
$acc1 = IDENT;
$limit = $len - 1;
for($i=0;$i<$limit;$i+=2)
{
$acc0 *= $data[$i];
$acc1 *= $data[$i+1];
}
//还需要循环 1+2 或者 1+1次
for(;$i<$len;$i++)
{
$acc0 *= $data[i];
}
$dest = $acc0*$acc1;
}
//2*1
function a7(array $v,&$dest)
{
$len = getLen($v);
$data = getVal($v);
$acc = IDENT;
$limit = $len - 1;
for($i=0;$i<$limit;$i+=2)
{
$acc = $acc * ($data[$i] * $data[$i+1]);//先运算和迭代非数据相关
}
//还需要循环 1+2 或者 1+1次
for(;$i<$len;$i++)
{
$acc = $acc * $data[i];
}
$dest = $acc;
}
function getLen(array $v)
{
return $v['len'];//data的长度
}
function getVal(array $v)
{
return $v['data'];
}
$i = 0;
$num = 0;
$num2=0;
$num3=0;
$num4=0;
Loop:
$a = new PerformanceTest();
$d = 0;
$v= buildData(1000000);
$sort = [];
$a->begin();
a1($v,$d);
$a->end();
$d = 0;
$a->begin();
a2($v,$d);
$a->end();
$d = 0;
$a->begin();
a3($v,$d);
$a->end();
$a3 = $a->getSpentTime();
$d = 0;
$a->begin();
a4($v,$d);
$a->end();
$a4 = $a->getSpentTime();
$d = 0;
$a->begin();
a5($v,$d);
$a->end();
$a5 = $a->getSpentTime();
$d = 0;
$a->begin();
a6($v,$d);
$a->end();
$a6 = $a->getSpentTime();
$d = 0;
$a->begin();
a7($v,$d);
$a->end();
$a7 = $a->getSpentTime();
if($a4 - $a3 < 0)
{
$num++;
}
if($a5-$a4<0)
{
$num2++;
}
if($a6-$a5<0)
{
$num3++;
}
if($a7-$a5<0)
{
$num4++;
}
if($i <100)
{
$i++;
goto Loop;
}
var_dump($num);var_dump($num2);var_dump($num3);var_dump($num4);//int(101) int(100) int(1) int(42) 百万数据
exit;
/**
注:奇怪的现象
int(757656) int(757680) int(24) time:0.00099992752075195秒
memory:24 b
int(757736) int(757712) int(-24) time:0.0010001659393311秒
memory:NAN b
int(757736) int(757712) int(-24) time:0.00099992752075195秒
memory:NAN b
int(757960) int(757936) int(-24) time:0秒
memory:NAN b
int(757712) int(757712) int(0) time:0.002000093460083秒
memory:NAN b
int(757736) int(757712) int(-24) time:0.00099992752075195秒
memory:NAN b
int(757736) int(757712) int(-24) time:0秒
memory:NAN b
int(757960) int(757936) int(-24) time:0.0010001659393311秒
memory:NAN b0秒
memory:NAN b
除了第一次占用了24byte外 其他都是负数的
解释: 每次调用函数 都要分配空间 a2 和 a3 实现方式一样 只是a2每次循环去取一次数据 所以分配的空间一样的 分配空间的使用有可能向上或向下使用内存
疑问:为什么a1第二次调用的时候不需要分配内存空间
**/
exit;
浙公网安备 33010602011771号