$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 :(得分: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。
如果您希望提高性能,您仍然需要做很多工作,但我希望这可以让您了解如何继续进行。