PHP字符串加入速度慢?

时间:2011-11-28 10:07:06

标签: php arrays string variables loops

对于php处理大量字符串来说似乎很慢,无论如何我可以提高它的速度吗? 我试图写的代码会将图像变成一串RGB值供以后使用 它会是这样的

$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;

2 个答案:

答案 0 :(得分:6)

首先要记住的是你正在进行大量的迭代。如果你的$ SIZE var是256,那么你实际上是在进行256 X 256(65536)次迭代。你加速循环的最大希望是找到一种方法来做你需要在更少的循环中实现的东西。

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

答案 1 :(得分: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,{{1}的键值的数组}和G,导致3个层次结构中的B总计。毫不奇怪你的代码很慢!

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

鉴于不是将单个单元格编码为“R,G,B”三元组,您可以将所有值编码为单个整数。比如代替:

256*256*3=196608 integers

鉴于0 => array( "R" => $r, "G" => $g, "B" => $b ) ,您可以将0<=r,g,b<=255编码为:

$arr2

现在你需要解开循环中的颜色值。这可以通过以下方式实现:

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

仅此修改就可以完全从阵列中删除一级层次结构。

在使用$ SIZE = 256运行原始代码时,我的设置中的平均执行速度为0.30秒。 通过给定的重构,我能够将此减少到0.10秒,将计算时间缩短到原始值的1/3。

如果您希望提高性能,您仍然需要做很多工作,但我希望这可以让您了解如何继续进行。