PHP的字符串连接速度慢


PHP slow on string joining?

对于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;

首先要记住的是,您正在进行大量的迭代。如果您的$SIZE变量为256,那么您实际上正在进行256 X 256(65536)次迭代。加快循环速度的最大希望是找到一种方法,用更少的循环完成你需要完成的事情。

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

根据给定的代码,我们可以对$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的键值数组,从而导致总共的256*256*3=196608 integers分为3个层次结构。毫无疑问,您的代码很慢!

我认为最好的策略是尽量减少数组中的项目总数。

假设不是将单个单元格编码为"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。

如果你想提高性能,你还有很多工作要做,但我希望这能给你一个如何进行的想法。