PHP медленнее на соединение строк?

для 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; 

Основываясь на вашем данном коде, мы можем перепроектировать структуру $ 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 от оригинала.

У вас все еще будет много работы, если вы хотите улучшить производительность, но я надеюсь, что это даст вам представление о том, как вы можете продолжить.

Первое, что нужно иметь в виду, это то, что вы делаете действительно большое количество итераций. Если ваш $ SIZE var равен 256, вы фактически выполняете итерации 256 X 256 (65536). Ваша самая большая надежда на то, чтобы ускорить вас, – это найти способ сделать то, что вам нужно, в меньшем числе циклов.

Вы можете попробовать использовать массив для создания строки, которую вы хотите вывести, а затем implode (), когда вы закончите. Тем не менее, это будет микро-оптимизация, и скорость, которую вы получите от нее, вероятно, не будет стоить усилий. Я бы предложил создать простой тестовый цикл, который вы можете сравнить, чтобы сравнить конкатенацию строк с построением массива и иммобилизацией.