LINUX.ORG.RU

как ускорить libpng?

 , ,


2

2

Есть такая blender сценка

http://pasteall.org/blend/index.php?id=48358

у меня она отрабатывается за 13 сек

$ time blender -b save.blend -f 1
real    0m13,314s
user    0m18,520s
sys     0m0,508s
Читал что причина в медленной компрессии png (zlib)

Может есть какие-то патчи/форки libpng/zlib для более быстрой png-компрессиии?

весь лог, для теоретиков, https://hastebin.com/xofojiqoyi.rb

★★★★★

Последнее исправление: brothermechanic (всего исправлений: 1)

Думается мне, в этих 13s 99.9% времени - рендер, а запись в png - копейки. Посмотри профиль (например, sysprof-ом).

yoghurt ★★★★★
()

libpng не шибко быстрый, но не настолько. Выше уже правильно написали, что там 99% - рендер.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

на рендер - секунда примерно, не больше, просто сделал тест на скорую руку, не стал заморачиваться чтоб было без рендера совсем

brothermechanic ★★★★★
() автор топика
Ответ на: комментарий от cvv

ты такой умный? прочти внимательно тему, ладно

brothermechanic ★★★★★
() автор топика

попробуй в какой-нить jpg сохранить или bmp. есть ожидание что время будет примерно такое же, т.е. никакие патчи не помогут.

vtVitus ★★★★★
()
Ответ на: так и есть от brothermechanic

Посмотрел в лог, как-то странно.

Какое выходное разрешение? Насколько жив диск? Насколько будет отличаться результат по времени, если писать например в /tmp?

Файл не качал, ибо блендера у меня под рукой нет.

yoghurt ★★★★★
()
$ time blender -b save.blend -f 1
...
Saved: '/home/vitaly/Downloads/0001.png'
 Time: 00:10.26 (Saving: 00:08.48)


Blender quit

real    0m11.811s
user    0m15.353s
sys     0m0.605s

Странно это все. Компрессия и сохраниение в файл тут точно не причем.

cvv ★★★★★
()
Последнее исправление: cvv (всего исправлений: 2)
Ответ на: комментарий от brothermechanic

На каком железе? У тебя время точно не на сжатие уходит. Включи больше отладочной инфы - может чтото прояснится.

cvv ★★★★★
()
Последнее исправление: cvv (всего исправлений: 1)
Ответ на: так и есть от brothermechanic

Сжатие в png занимает микросекунды. Просто забудь об этом. Хотя можешь гдето в настройках выключить сжатие если сильно хочется.

cvv ★★★★★
()
Ответ на: комментарий от yoghurt

Какое выходное разрешение?

PNG image data, 3840 x 2160, 8-bit/color RGB, non-interlaced

Насколько будет отличаться результат по времени, если писать например в /tmp?

не будет. Там какойто композитинг или что-то в этом духе.

cvv ★★★★★
()
Ответ на: комментарий от brothermechanic

железо не причем,

Согласен

так как если я отключаю компрессию, то создание png занимает 2 секунды

Хммм ... Такое впечатление что ты отключаешь какойто постпроцессинг а не сжатие png. Может там под «компрессией» подразумевается сжатие динамического диапазона или чтото в этом духе?

cvv ★★★★★
()
Ответ на: комментарий от cvv

Вряд ли, так как диалог сохранения png, во всех редакторах сходный, и параметр процента компрессии ведет себя одинаково, ну то есть тормозит libpng/zlib

brothermechanic ★★★★★
() автор топика

Попробуй пересобрать пакет с другими параметрами "-march".

ZenitharChampion ★★★★★
()
Ответ на: комментарий от cvv

Хммм ... Такое впечатление что ты отключаешь какойто постпроцессинг а не сжатие png. Может там под «компрессией» подразумевается сжатие динамического диапазона или чтото в этом духе?

Что-то тебя заклинило. ТС прав, тормозит именно сжатие png. Создай в GIMP файл 3840x2160, примени фильтр например «Шум RGB», чтоб не просто белый лист был (ну или любую картинку соответствующего разрешения открой) и экспортируй это дело сначала в bmp, а потом в png. И убедись уже, что сохранения png очень медленное.

Ускорить на несколько процентов можно пересобрав libpng под свою машину со всеми оптимизациями. Ускорить в разы не получится никак. Оно по природе своей медленное при сохранении (зато просмотр вполне быстрый)

anonymous
()
Ответ на: комментарий от cvv

Сжатие в png занимает микросекунды. Просто забудь об этом.

На каком месте в топ100 суперкомпьютеров твоя машина?

Если вообще не в топ100, то КАК? Даже бы при разрешении, как у ТС — 3840x2160, оно занимает секунды, причём даже около десяти на современных десктопах. При максимальном уровне сжатия, конечно.

anonymous
()
Ответ на: комментарий от anonymous

Одно, кстати.

Ну вот, значит, и выяснили способ ускорить в разы — переписать libpng, чтобы параллелилось. Правда микросекунд на домашней машине всё равно не будет, даже на восьми ядрах.

anonymous
()
Ответ на: комментарий от anonymous

параллельно

Там же zlib под капотом, он умеет разве блочную компрессию?

Deleted
()
Ответ на: комментарий от brothermechanic

Ну дак выкинь это png, либо сохраняй не с экстремальными настройками. Ты место экономишь?

rustonelove
()
Ответ на: комментарий от anonymous

Что-то тебя заклинило. ТС прав, тормозит именно сжатие png. Создай в GIMP файл 3840x2160, примени фильтр например «Шум RGB», чтоб не просто белый лист был (ну или любую картинку соответствующего разрешения открой) и экспортируй это дело сначала в bmp, а потом в png. И убедись уже, что сохранения png очень медленное.

Ну хз. Я взял 3840x2160x4 байт мусора и сжал gzip-ом на селероне. Это конечно не быстро, но отнюдь и не 13 секунд, как у ТСа:

vadim@aquila:~$ head -c `expr 3840 \* 2160 \* 4` /dev/urandom > /tmp/1.tmp
vadim@aquila:~$ ls -l /tmp/1.tmp 
-rw-r--r-- 1 vadim vadim 33177600 ноя 21 18:06 /tmp/1.tmp
vadim@aquila:~$ time gzip -9 < /tmp/1.tmp > /dev/null 

real	0m2,902s
user	0m2,547s
sys	0m0,034s
vadim@aquila:~$ time gzip -6 < /tmp/1.tmp > /dev/null 

real	0m3,426s
user	0m2,625s
sys	0m0,047s
vadim@aquila:~$ time gzip -1 < /tmp/1.tmp > /dev/null 

real	0m2,977s
user	0m2,400s
sys	0m0,042s
vadim@aquila:~$ 
Deleted
()
Ответ на: комментарий от anonymous

Хм, а вот если из gimp-а сохранять, то действительно долго.

Deleted
()
Ответ на: комментарий от anonymous

Провел эксперимент. Я получил гдето 3.5 секунды на картинке автора на максимальном сжатии. Странновато, но все равно это далеко не те 10 секунд которые у ТС.

cvv ★★★★★
()
Последнее исправление: cvv (всего исправлений: 1)
Ответ на: комментарий от brothermechanic

А может ты попробуешь другие форматы вместо PNG? Ну там TIFF, TGA, ... . PNG сверх компресии при помощи zlib, выполняет сжатие LZ77, которое видимо и сьедает все твое время. LZ77 быстрым не бывает.

Вобщем мою фразу о том что libpng жмет за микросекунды теперь нужно понимать «zlib жмет за доли секунды». Извиняюсь за введение в заблуждение.

cvv ★★★★★
()
Последнее исправление: cvv (всего исправлений: 1)
Ответ на: комментарий от Deleted

Я тут откопал что libpng жмет комбинацией LZ77 и zlib. LZ77 быстрым не бывает, это по всей видимости и есть корень его тормозов.

cvv ★★★★★
()
Последнее исправление: cvv (всего исправлений: 3)
Ответ на: комментарий от cvv

нет, я png люблю, ну и при 70% он у меня отрабатывает тест за 6 сек

brothermechanic ★★★★★
() автор топика
Ответ на: комментарий от cvv

теперь понятно?

bm@BM ~ $ time gzip -9 < /tmp/1.tmp > /dev/null
bash: /tmp/1.tmp: Нет такого файла или каталога

real    0m0,001s
user    0m0,001s
sys     0m0,000s
bm@BM ~ $ head -c `expr 3840 \* 2160 \* 4` /dev/urandom > /tmp/1.tmp
bm@BM ~ $ ls -l /tmp/1.tmp 
-rw-r--r-- 1 bm users 33177600 ноя 21 21:07 /tmp/1.tmp
bm@BM ~ $ time gzip -9 < /tmp/1.tmp > /dev/null 

real    0m1,118s
user    0m1,110s
sys     0m0,006s
brothermechanic ★★★★★
() автор топика
Ответ на: теперь понятно? от brothermechanic

теперь понятно?

:-)

Всеравно эта одна секунда zlib ничего не решает на фоне 9 секунд LZ77.

cvv ★★★★★
()
Ответ на: комментарий от cvv

Неправильно откопал. PNG по архитектуре жмёт zlib (RFC 1950) которая представляет из себя минимальную обёртку над Deflate (RFC 1951), который представляет из себя комбинацию LZ77 и Huffman.

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

Scondo
()
Ответ на: комментарий от Scondo

Неправильно откопал. PNG по архитектуре жмёт zlib (RFC 1950) которая представляет из себя минимальную обёртку над Deflate (RFC 1951), который представляет из себя комбинацию LZ77 и Huffman.

Вау, это обьясняет почему gzip отрабатывал намного дольше чем я предполагал изначально: я совершенно забыл что zlib это не чистый Huffman :-(

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

:-)

cvv ★★★★★
()
Ответ на: комментарий от Scondo

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

Вот оно что. Про это не знал.

Deleted
()
Ответ на: комментарий от brothermechanic

Ну, если решать задачу как разработчик - то вызвав что-то вроде

png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE, PNG_FILTER_NONE);

Как это решить на уровне пользователя Blender - не знаю, надо читать доки к Blender. Не факт, что соответствующие опции проброшены вообще.

Решить это «оптимизацией компиляции» скорее всего не получится: PNG просто спроектирован таким образом, что один из этапов сжатия очень ресурсоёмок. Его можно либо отключить, либо использовать. «Ускорить» его практически невозможно.

Scondo
()

На фуфыксе затестите, посоны.

anonymous
()
blender -b save.blend --render-format BMP -f 1

Для такого изображения получившийся bmp всего в четыре раза больше, чем png.

greenman ★★★★★
()
Ответ на: комментарий от greenman

Ну, она просто один из этапов сжатия пропускает, скорее всего.

FFSinit ★★
()
Ответ на: комментарий от i-rinat

Думаю, для максимального сжатия там что-то типа optipng используется.

greenman ★★★★★
()
26 декабря 2017 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.