Бенчмарк графических библиотек для PHP

в 15:43, , рубрики: imagemagick, php, phpixie, метки: , ,
image
В проекте который мы сейчас разрабатываем много работы с фотографиями, в результате чего скорость графической библиотеки является фактически главным фактором при оптимизации сайта. Не секрет что ImageMagick давно стал стандартом разработки на PHP, хотя уже некоторое время его оттуда сталкивает форк под названием GraphicsMagick. Мне стало интересно насколько сильно они отличаются и сколько форы могут дать старому доброму GD. К счастью как раз недавно вышел графический модуль для PHPixie который поддерживает все три библиотеки, что и позволило мне провести достаточно интересные тесты.

В духе самого фреймворка экспериментировать будем на фее которая справа ( взята с девиантарта http://j-scott-campbell.deviantart.com/ ). Если кому-то покажется что в ней слишком много иннуендо, то посмею напомнить что уже больше 20 лет стандартным рисунком тестирования графических алгоритмов является Lenna из плейбоя.

Сейчас следует короткое описание тестов и выходные рисунки. В конце статьи будет сам бенчмарк скорости работы одной таблицей.

Простое масштабирование

Итак сначала попробуем уменьшить ее до 100 пикселей по ширине.

$pixie->image->read($dir.'fairy.jpg')
			->resize(200)
			->save($dir.'resize.jpg');

image

Разницы особой на первый взгляд незаметно, но например ее глаз на GD версии не имеет того ярко выраженного зеленого цвета как у Imagick и Gmagick.

Создание квадратной аватарки

Чтобы сделать автарку квадратной ее нужно сначала масштабировать по меньшей стороне а затем обрезать по большей. На PHPixie это делается довольно просто:

$pixie->image->read($dir.'fairy.jpg')
			->resize(200, 200, false)
			->crop(200, 200)
			->save($dir.'crop.jpg');

image
Очевидно что выглядеть они будут идентически предидущим.

Написание текста и создание пустого изображения

Теперь попробуем создать белый рисунок и написать текст фиолетовым цветом используя TTF шрифт.

$pixie->image->create(300, 70, 0xffffff, 1)
			->text("Hello World", 50, $dir.'/Sofia-Regular.ttf', 10, 50, 0x5B43AA)
			->save($dir.'text.jpg');

image

Тут результаты немного подраматичней. GD почему-то сделала цвет текста темней и гораздо хуже сработал антиалиасинг, в результате чего края текста немного размыты. У обеих Magick-ов текст получился гораздо лучше.

Разбиение текста на строки

Текст на строки разбивает сама PHPixie, но для этого она использует информацию о метрике текста от графической библиотеки. Так как приходится считать размер каждого слова это может быть довольно дорогим процессом. Итак попробуем поместить на пустую страницу кусочек песенки.


$text = "When I closed my eyes to the shimmering light ".
           "all memory faded and I could see ".
           "that a mushroom circle of red and white ".
           "and myriad fairies surrounded me. ";

$pixie->image->create(300, 180, 0xffffff, 1)
			->text($text, 20, $dir.'/Sofia-Regular.ttf', 10, 50, 0x5B43AA, 1, 300)
			->save($dir.'wrap.jpg');

image

На меньшем шрифте недостатки не так заметны но если присмотреться к изгибам то довольно легко можно отличить. Но надо заметить что Imagick потратил намного больше времени, прежде всего из за пересчитывания метрики шрифта на каждом слове (ведь приходится наново считывать шрифт с диска каждый раз) в то время как GD и Gmagick были намного быстрее.

Наложение и оборачивание рисунков

Этот тест наиболее оторван от реальности, но хотелось побенчить скорость наложения рисунков и вообще операции посложнее. Итак мы создаем пустой рисунок, с одной стороны ставим автарку феи а с другой ту же аватарку только обернутую по горизонтали и вертикали да еще и развернутую боком.


$canvas = $pixie->image->create(400, 200);
	$fairy = $pixie->image->read($dir.'fairy.jpg')
				->resize(200, 200, false)
				->crop(200, 200);
	$canvas	->overlay($fairy, 0, 0)
			->overlay($fairy->flip(true, true)->rotate(90), 200, 0)
			->save($dir.'overlay.jpg');

image

Скорость работы

А вот и сам бенчмарк. По горизонтали слева-направо проведенные тесты, по вертикали среднее время исполнения ( каждый тест прогонялся 100 раз).

image

Вывод, лучше всего таки использовать Gmagick, если его нет то Imagick. Над GD можно задуматься только в случае если надо будет писать много текста и то не очень замысловатым шрифтом.

Кстати отдельно замечу насколько сильно мне понравился интерфейс самой PHPixie в этом плане, в особенности наличие функций для множества стандартных действий (тот же самый враппинг текста) для которых раньше приходилось качать отдельные классы.

Автор: jigpuzzled

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js