对于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
, G
和B
的键值数组,从而导致总共的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。
如果你想提高性能,你还有很多工作要做,但我希望这能给你一个如何进行的想法。