papilio

Скорость создания PNG в PHP средствами GD

Меня сейчас очень интересует, стоит ли работать с изображениями в PHP. Сомнения вызывает не возможности работы с библиотекой GD, а скорость создания PNG-изображений.

Для этого я создал небольшой PHP-скрипт, который генерирует случайный массив чисел с координатами для шестиугольника. А этот шестиугольник рисуется на изображении размером 250×250 px, которое сохраняется в файл. Скрипт работает в течение 10 секунд. Несколько раз запуская этот скрипт, который генерирует сотни изображений, я могу получить среднюю производительность (изображений в секунду).

Сам скрипт:

// current time
$time = time();
 
// create dir
mkdir ('test/' . $time, 0777);
 
// min and max values
$min = 0;
$max = 250;
 
// i
$i = 0;
 
while (time() < $time + 10) {
	// set up array of points for polygon
	$values = array(
            rand($min,$max),  rand($min,$max),  // Point 1 (x, y)
            rand($min,$max),  rand($min,$max), // Point 2 (x, y)
            rand($min,$max),  rand($min,$max),  // Point 3 (x, y)
            rand($min,$max),  rand($min,$max),  // Point 4 (x, y)
            rand($min,$max),  rand($min,$max),  // Point 5 (x, y)
            rand($min,$max),  rand($min,$max)   // Point 6 (x, y)
            );
 
	// create image
	$image = imagecreatetruecolor(250, 250);
 
	// some colors
	$bg   = imagecolorallocate($image, 200, 200, 200);
	$blue = imagecolorallocate($image, 0, 0, 255);
 
	// draw a polygon
	imagefilledpolygon($image, $values, 6, $blue);
 
	// save image
	imagepng($image, 'test/' . $time . '/' . $i . '.png');
	imagedestroy($image);
	$i++;
}

Изображения получаются примерно такими:

PNG-изображение

Итак, результаты:

  • 48 изображений в секунду на моём ноутбуке
  • 70 изображений в секунду на виртуальном хостинге

Результаты вполне нормальные :-)

Метки: , , , , ,



Есть комментарии (13):

  1. Azeem @ 14/01/2008 в 19:43

    Интересно, а как скорость рисования будет зависеть от числа шестиугольников на одном рисунке (или вообще вершин, если рисовать различные многоугольники)?

  2. Eunix @ 14/01/2008 в 21:16

    При увеличении количества вершин:

    — 12 вершин — скорость упала на 5%,

    — 18 вершин — скорость упала на 10%,

    — 80 вершин — скорость упала на 30%,

    — 240 вершин — скорость упала на 60%.

    При увеличении количества многоугольников:

    — 20 фигур — на 45%,

    — 50 фигур — на 70%,

    — 250 фигур — на 89%.

    Что думаешь?

  3. Eunix @ 14/01/2008 в 21:21

    Кстати, использование всяких приёмов для сглаживания не сильно сказывается на производительности.

  4. Azeem @ 15/01/2008 в 21:05

    Я так понял, что при рисовании 250 6-угольников скорость упала на 89%, т.е рисовалось примерно 8 картинок в секунду на виртуальном хостинге. Вроде бы не плохо. А что если увеличить размер изображения? Например взять 600x400px? Сглаживание не сказывается на производительности — видимо оно применяется 1 раз ко всему изображению, а не отдельно к каждому многоугольнику. В целом, думаю результаты хорошие.

  5. Eunix @ 15/01/2008 в 22:59

    Да, примерно такая скорость. Это на ноутбуке. На виртуальном хостинге результаты лучше на 30%. И даже выше :)

    Надо попробовать с другими библиотеками — не только GD есть.

  6. Eunix @ 15/01/2008 в 23:10

    Нашёл интересное сравнение библиотек. Если есть время, то попробуй реализовать подобное с использованием ImageMagik.

    Кстати, стандартный tile 256×256. Зачем больше? :)

  7. Vladislav Ukhov @ 23/05/2008 в 10:37

    1. А какие параметры ноутбука? Процессор, память, тип HDD, ОС?

    2. Что будет, если в 5 и 36 строке путь указать абсолютный? На хостинге и на ноуте отдельно?

    3. Что будет, если по скрипт закодировать Zend, например, и выполнять под Zend Optimizer?

  8. xyz @ 09/01/2009 в 23:37

    жесть какая-то, а не код:

    mkdir ('test/' . $time, 0777);

    говночитабельность и минимальные прибавки скорости выполнения.

    # mkdir «test/$time», 0777;

    $min = 0;

    $max = 250;

    // i

    $i = 0;

    # lol xD

    ($min, $max, $i) = (0, 250, 0);

    м?

    imagepng ($image, 'test/' . $time . '/' . $i . '.png');

    # жесть какая-то. какие прибавки в скорости вы хотите получить от такого скрипта, тем более от GD)...

    # imagepng ($image, «test/$time/$i.png»);

    # пиши на пейтоне или пёрле)

  9. Eunix @ 09/01/2009 в 23:44

    Пишу и на пайтоне. Писал на перле. А этот код всего лишь был приведён в качестве примера чего-то там :) он свою функцию выполнил.

  10. xyz @ 09/01/2009 в 23:50

    >> он свою функцию выполнил.

    важно каким образом он свои функции там выполнил.

    Пофигу как работает, главное что работает? XDD

  11. Eunix @ 09/01/2009 в 23:51

    Нет, конечно :) он показал, что возможно создание тайлов на сервере.

  12. Eunix @ 09/01/2009 в 23:52

    Это было год назад O_o сейчас я бы написал по-другому, конечно.

  13. xyz @ 10/01/2009 в 00:03

    Может я чего-то недопонимаю, но собственно в чём проблема создания png изображения на сервере (д-м w2003 (адм.учётка) ну или никсовый сервак)?

    # от GD вообще не ожидают дикой производительности, как и многопоточности от пхп)

Оставить комментарий