для 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 (), когда вы закончите. Тем не менее, это будет микро-оптимизация, и скорость, которую вы получите от нее, вероятно, не будет стоить усилий. Я бы предложил создать простой тестовый цикл, который вы можете сравнить, чтобы сравнить конкатенацию строк с построением массива и иммобилизацией.