【发布时间】:2011-12-06 23:50:13
【问题描述】:
有一个如下的foreach:
foreach($data as $r=>$d)
{
$return = $return. "<tr>
<td>
".$d["client_id"]."
</td>
......
<td>
".$d["date_stamp"]."
</td>
</tr>";
}
}
这需要我的数据超过 2 秒!进行处理,但是如果我执行以下操作:
foreach($data as $r=>$d)
{
$now= "<tr>
<td>
".$d["client_id"]."
</td>
......
<td>
".$d["date_stamp"]."
</td>
</tr>";
$return = $return.$now;
}
只需要0.2秒..
好吧,好吧,你说“好吧,使用第二种方法”,我当然会这样做,但这对我来说是个谜为什么两种方法之间的性能差异如此之大?任何想法好的。。谢谢
添加测试用例:
//////////function to get time
function parsemicrotime(){
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
////////////define test array
$a = array();
for($i = 0; $i < 5000; $i ++)//generate 5k rows
{
for($k=0; $k<5;$k++)//lets have just 6 columns
{
$a[$i]["column_".$k] = 'test string '.$i.' / '.$k.' - note that the size of the $output string makes a huge difference ';
}
}
///////////////first test
$time_start = parsemicrotime();
$output = '';
foreach($a as $row=>$columns)
{
$output = $output ."
<tr>
<td>".$columns["test_0"]. "</td>
<td>" .$columns["test_1"]. "</td>
<td>" .$columns["test_2"]. "</td>
<td>" .$columns["test_3"]. "</td>
<td>" .$columns["test_4"]. "</td>
<td>" .$columns["test_5"]. "</td>
</tr>";
}
$approach_1_result = parsemicrotime()-$time_start;
/////////////second test
$time_start2 = parsemicrotime();
$output2 = '';
foreach($a as $row2=>$columns2)
{
$now2= "
<tr>
<td>".$columns["test_0"]. "</td>
<td>" .$columns["test_1"]. "</td>
<td>" .$columns["test_2"]. "</td>
<td>" .$columns["test_3"]. "</td>
<td>" .$columns["test_4"]. "</td>
<td>" .$columns["test_5"]. "</td>
</tr>";
$output2 = $output2 .$now2;
}
$approach_2_result = parsemicrotime()-$time_start2;
/////////////third test
$time_start3 = parsemicrotime();
ob_start();
$output3 = '';
foreach($a as $row3=>$columns3)
{
echo "
<tr>
<td>".$columns["test_0"]. "</td>
<td>" .$columns["test_1"]. "</td>
<td>" .$columns["test_2"]. "</td>
<td>" .$columns["test_3"]. "</td>
<td>" .$columns["test_4"]. "</td>
<td>" .$columns["test_5"]. "</td>
</tr>";
}
$output3 = ob_get_clean();
$approach_3_result = parsemicrotime()-$time_start3;
die("first test:".$approach_1_result."<br>second test:".$approach_2_result."<br>third test:".$approach_3_result);
【问题讨论】:
-
您是否不止一次地经历过这种情况,或者只是一次经历过这种情况?比如,CPU 忙于其他事情,网络速度慢,或者其他什么
-
因为您实际上做了其他指标。
-
尽量重现问题。
-
有多少次迭代?然而:听起来很奇怪,无论如何......
-
是的,它是二维数组,在 foreach 之前和之后测量时间,用这两种方法尝试了几次,结果 +- 一直相同..使用 echo 更快,但是 echo 和 $return=$return.$new 的区别;是微不足道的(并且添加 ob_start() 等甚至可能会减慢一点)
标签: php performance variables foreach variable-assignment