2011-11-28 32 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()。然而,這將是一個微型優化,你從中獲得的速度增益可能不值得。我建議建立一個簡單的測試循環,你可以用基準來比較字符串連接與數組構建和內爆。