2011-11-28 68 views
1

它似乎非常缓慢的PHP来处理大量的字符串,有无论如何我可以提高它的速度? 我试图写将使图像转换成RGB值的字符串供以后使用 它会是这样的PHP加入字符串很慢?

$string = "255:255:253#12:12:23#33:34:24"/*an output of a $SIZE = 3 image*/ 

问题的代码是,当$ SIZE是大如256,它会采取生成字符串最长1秒

$r = ""; 
$g = ""; 
$b = ""; 

for($y = 0; $y <= $SIZE-1; $y++){ 
    for($x = 0; $x <= $SIZE-1; $x++){ 


     {$r .= $arr2[$y][$x]["R"].":";} 

     {$g .= $arr2[$y][$x]["G"].":";} 

     {$b .= $arr2[$y][$x]["B"].":";} 

    } 
} 
$r = rtrim($r, ":"); 
$g = rtrim($g, ":"); 
$b = rtrim($b, ":"); 
$str_a .= $r."#".$g."#".$b; 
+0

存储整个结果,然后在将来运行只改变实际需要改变的总面积的部分。减少你的工作区域将产生巨大的影响。 – DavidO

+0

我唯一能看到的东西可以让这个效率更高(而且收益可以忽略不计)是在开始时进行一次'$ SIZE-1'计算并存储它,而不是在每次迭代时都这样做。 – DaveRandom

回答

4

基于你给定的码,我们可以反向工程的$结构ARR2到(假设R,G和B是整数,从0到255):

$arr2 = array(
    0 => array(
     0 => array(
     "R" => 128, 
     "G" => 64, 
     "B" => 255 
    ), 
     1 => array(
     ... 
    ) 
    ) 
); 

鉴于您$SIZE被设置为256,您将共有256*256=65536阵列进一步包含键值为R,GB的键值的阵列,从而在3个层级中产生总计256*256*3=196608 integers。毫不奇怪,你的代码很慢!

我认为这里最好的策略是尝试减少数组中的项目总数。

由于不是将单个单元格编码为“R,G,B”三元组,而是可以将所有值编码为一个整数。例如,而不是:

0 => array("R" => $r, "G" => $g, "B" => $b) 

鉴于0<=r,g,b<=255,你可以编码$arr2为:

0 => ($r<<16 + $g<<8 + $b); 

现在当然你需要解压您的循环内的颜色值也是如此。这可以通过以下方式实现:

$col = $arr2[$y][$x]; 
$col_b = ($col&255); 
$col_g = ($col>>8)&255; 
$col_r = ($col>>16)&255; 
$r .= $col_r.":"; 
$g .= $col_g.":"; 
$b .= $col_b.":"; 

单独进行此修改会完全切断阵列中的一个层级。

在使用$ SIZE = 256运行原始代码时,我的设置中的平均执行速度为0.30秒。 在给定的重构条件下,我可以将其缩短到0.10秒,将计算时间缩短到原来的1/3。

如果您希望提高性能,您仍然有许多工作要做,但是我希望这可以让您知道如何继续。

6

首先要记住的是,您正在进行非常多的迭代。如果你的$ SIZE var是256,那么你实际上正在做256×256(65536)迭代。加速你循环的最大希望就是找到一种方法,以更少的循环完成你所需要的。

您可以尝试使用数组来构建要输出的字符串,然后在完成时implode()。然而,这将是一个微型优化,你从中获得的速度增益可能不值得。我建议建立一个简单的测试循环,你可以用基准来比较字符串连接与数组构建和内爆。