Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 31323
SOFT FOR YOU
Кстати в проектах Tiny.Library и BrainMM я освоил подход, когда Си/C++ код компилируется в obj файлы сразу под несколько платформ, и относительно легко линкуется в Delphi, FreePascal, C++Builder. Там есть уже набор утилит, скриптов, наборов опций, чтобы осуществлять всю эту рутину. Удаётся даже поддерживать register-соглашение, которого по умолчанию в Си/С++ нет.

Это я к чему говорю. Если кто-то хочет использовать статически прилинкованный код, написанный на Си/С++, например для конвертации jpeg, png, для поддержки TLS того же самого - обращайтесь - я буду помогать чем смогу.
- доктор, меня все игнорируют. что со мной?
- следующий!

(С)
26 июл 20, 11:41    [22173768]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2904
Мимопроходящий,

В твоём случае мимопроходящий )
26 июл 20, 11:43    [22173769]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2904
Соколинский Борис,

Это понятно. Просто кроме jpeg есть и другие алгоритмы с потерей качества
На видюхах они давно используются
Более того, на них даже FPS больше, потому что меньше памяти тягается
26 июл 20, 11:46    [22173770]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 12798
SOFT FOR YOU,
jpeg - формат, заточенный исключительно под фотографии. Для искусственно генерируемых растров, естественно, найдется что-то более эффективное.
26 июл 20, 12:02    [22173773]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2904
Соколинский Борис,

Почему искусственно?
Огромное количество текстур срисовывается или сфотографируется с реальных объектов
Так что не совсем согласен

А что насчёт jpeg-а - он неплохо кодируется и CPU. Просто почему Delphi 7 делает это в разы быстрее Delphi XE 10 - отдельный вопрос
26 июл 20, 12:28    [22173777]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Sapersky
Member

Откуда:
Сообщений: 66
SOFT FOR YOU,

Но если у библиотеки интерфейс на C++, т.е. нужно вызывать методы классов, то как ты её прилинкуешь? Например OpenCV последних версий.
А для своего кода на Си по-моему удобнее dll, отлаживать проще.

По теме сжатия картинок, забавно, что даже на CPU jpeg остаётся самым быстрым форматом сжатия (если не брать совсем уж примитив вроде RLE) за счёт хорошо вылизанных библиотек. Мне вот был бы интересен алгоритм сжатия БЕЗ потерь, который работал бы сопоставимо по скорости с libjpeg-turbo - а нет такого. Самый быстрый из тех, что я накопал называется ImageZero, и он всё равно в 2-3 раза медленнее. Хотя возможно это проблема эталонной реализации от автора, надо почитать описание и прикинуть, можно ли туда приспособить SIMD.
26 июл 20, 13:33    [22173789]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2904
Sapersky,

Dll в миллиард раз проще разумеется
Но если ты можешь прилинковать obj - автоматически снимается проблема развертывания, версии компонентов, конфликтов и прочей фигни

Если код на С++ - есть возможность экспортировать Си-функции
Если есть классы - можно делать обёртки

Но основная проблема - это зависимости
То есть стандартные функции типа malloc, вызов API, внутренние типа __chkstk_ms

С этими зависимостями бороться сложно, но можно
Та же библиотека jpeg, или zlib - хорошие примеры
Я где-то видел OpenSSL в обьектниках. Но не для всех платформ
26 июл 20, 14:15    [22173795]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 12798
Sapersky
По теме сжатия картинок, забавно, что даже на CPU jpeg остаётся самым быстрым форматом сжатия
PNG по поим замерам быстрее раза в 3.
26 июл 20, 15:13    [22173813]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
rgreat
Member

Откуда:
Сообщений: 6068
Соколинский Борис,

PNG это обычный zlib. Скорость от уровня сжатия зависит.
26 июл 20, 15:25    [22173817]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Sapersky
Member

Откуда:
Сообщений: 66
SOFT FOR YOU

Если код на С++ - есть возможность экспортировать Си-функции
Если есть классы - можно делать обёртки
Само собой, но это масса ручной работы.
А Clang на Винду ты ставил? У меня поставился только через msys2, а официальный инсталлятор при попытке что-то скомпилировать выдавал ошибку линкера. Я так понял - из-за того, что Clang отчасти использует заголовки и либы от gcc, и нужно их в стиле Линукса/msys2 ставить в одну папку.

Соколинский Борис
PNG по поим замерам быстрее раза в 3.
Удивительно, по моим тестам Png один из самых тормозных (даже с мин. степенью сжатия).
Какая картинка, какая библиотека?

rgreat
PNG это обычный zlib. Скорость от уровня сжатия зависит.
Точнее, при минимальном сжатии чистый zlib. При не самом минимальном сначала применяются т.н. фильтры, которые должны улучшить сжимаемость.
26 июл 20, 15:45    [22173822]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 12798
Sapersky

Соколинский Борис
PNG по поим замерам быстрее раза в 3.
Удивительно, по моим тестам Png один из самых тормозных (даже с мин. степенью сжатия).
Какая картинка, какая библиотека?
Точно не скажу, давно проверял. Картинка была порядка 3-5 МП на локальном диске, использовал GDI+ (вроде бы, может и libxxx), замерял время на открытие+получение полного битмапа в памяти. PNG по сравнению с BMP имел коэффициент ~2, JPEG - ~6.
26 июл 20, 16:00    [22173826]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Sapersky
Member

Откуда:
Сообщений: 66
Соколинский Борис,

Если со стандартным модулем jpeg сравнивал (или с jpeg из старого GDI+), или картинка была подходящая для Png, то может Png и был быстрее.

SOFT FOR YOU,

Смотрел TinyMove - ты там насочинял на ассемблере, а между тем всякий нормальный Си-компилятор (gcc/clang/icc) тебе что-то подобное сгенерирует сам из максимально тупого кода, можешь проверить в godbolt. Возможно, неидеально сгенерирует (напр. Clang тупит - перекладывает в 8-байтовом цикле по 1 байту), но для меня это компенсируется простотой кода и скоростью разработки.
26 июл 20, 16:11    [22173827]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2904
rgreat
Соколинский Борис,

PNG это обычный zlib. Скорость от уровня сжатия зависит.


Не обычный
Мне кажется если чисто zlib-ом жать - получится быстрее
Там разделение на чанки - я думаю, это замедляет
26 июл 20, 16:15    [22173829]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2904
Sapersky
SOFT FOR YOU

Если код на С++ - есть возможность экспортировать Си-функции
Если есть классы - можно делать обёртки
Само собой, но это масса ручной работы.
А Clang на Винду ты ставил? У меня поставился только через msys2, а официальный инсталлятор при попытке что-то скомпилировать выдавал ошибку линкера. Я так понял - из-за того, что Clang отчасти использует заголовки и либы от gcc, и нужно их в стиле Линукса/msys2 ставить в одну папку.


Я только под виндой и компилирую
Но так как имею дело с низкоуровневым кодом без зависимостей - окружение не настраивал
Ты прав, эта большая тема

Я создавал тему на геймдеве, мне там немного помогли, но дело с мёртвой точки не сдвинулось: https://gamedev.ru/flame/forum/?id=243821
Более того, я нанимал чувака, чтобы он сделал то же самое - но до результата не дошло. Остались несколько статей на вики в моём внутреннем репозитории. Если интересно почитать или можешь продвинуться в вопросе - могу предоставить права, переходи в личку.
26 июл 20, 16:24    [22173831]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2904
Sapersky

Смотрел TinyMove - ты там насочинял на ассемблере, а между тем всякий нормальный Си-компилятор (gcc/clang/icc) тебе что-то подобное сгенерирует сам из максимально тупого кода, можешь проверить в godbolt. Возможно, неидеально сгенерирует (напр. Clang тупит - перекладывает в 8-байтовом цикле по 1 байту), но для меня это компенсируется простотой кода и скоростью разработки.


А я преимущественно низкоуровневый на Clang и пишу
Очень удобно, условно один код, нажал скриптик - собралось сразу под 10 платформ: 5 операционных систем по 2 битности
GCC такой штукой к сожалению не обладает
И IDE не нужно - фигачу всё в годболте

На ассемблер перехожу неохотно и исключительно вынуждено
К сожалению Clang не всегда идеально оптимизирует код (и GCC кстати эквивалентный код выдаёт)
Насчёт реализации: там ассемблер только под x86 и x64. Под ARM-ы только на Си
Я сравнивал по производительности высокоуровневый вариант с ассемблером - было процентов на 20 медленнее
Я 2 недели эту функцию писал, а за основу (на малых размерах) взял код Шарахова из стандартного Move для x86
26 июл 20, 16:32    [22173834]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Sapersky
Member

Откуда:
Сообщений: 66
SOFT FOR YOU,

Ладно, почитаю тему на Геймдеве, но сейчас нет настроения влезать в это с головой.
В целом меня и msys2 устраивает, и кстати, там можно получить более новую версию gcc в сравнении с mingw на sourceforge. Кросс-компиляция интересна разве что между x86 и x64, а то приходится ставить отдельно 2 версии компилятора. Но это не такая большая проблема.

По TinyMove, а 20% - это на больших или малых размерах? Если на малых, то большие мне кажется можно отдать на откуп компилятору. Простыню из (v)movups он должен сгенерировать без проблем.
26 июл 20, 17:02    [22173837]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2904
Sapersky,

А мне там вроде msys2 и посоветовали
Но до результата не дошло - билд сервер не был настроен
В любом случае будет желание посотрудничать по какому-либо направлению - милости прошу

20% было на размерах до 48 байт
По сути это и есть самые ходовые размеры

TinyMove - он ведь не для Си/С++ кода, он в первую очередь для Delphi/FreePascal, как аналог Move
Делать медленнее стандартного Move не вижу смысла
А так нормально получилось :)
26 июл 20, 17:10    [22173838]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Sapersky
Member

Откуда:
Сообщений: 66
SOFT FOR YOU,

Да я не спорю, что нормально. Но 20% дают табличные джампы на маленьких размерах, а на ассемблере у тебя написан длинный move, который вроде как ничего (?) в сравнении с высокоуровневой версией не даёт. То есть писать его на ассемблере было необязательно - вот это я хотел сказать.
27 июл 20, 14:40    [22174205]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2904
Sapersky,

Не, там всё в комплексе
Главный инсайт - это важность выравнивания кода на 16 и 64 байта. Если заметишь - у меня там много nop-ов. Каждый nop выверен )

Ещё важна очередность сравнений и джампов. Поменяешь два джампа местами - для некоторых кейсов производительность просаживается

Для больших размеров стандартных 3 регистров не хватает - нужно пушить дополнительные. Но если это делать на высоком уровне - регистры пушатся в самом начале функции, а не на месте. Что раздувает код, жрет лишние такты

Для больших кусков case может выполняться стандартно через массив указателей. А я этого избежал. Из того рассчета, что каждый movups со смещением занимает 4 байта. Поэтому для Win64 я сваплю Count в rax, иначе movups занимает 5 байт

Кстати интересное наблюдение. movups даёт на выровненных данных такую же производительность, что и movaps
27 июл 20, 14:58    [22174211]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2904
Sapersky,

Насчёт отдельно большого мува на высоком уровне
Я замерял, есть разница
Может даже в районе 5%
27 июл 20, 15:00    [22174215]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 1010
У png нет настраиваемой степени сжатия. Всегда одно - сжатие без потерь по алгоритму Deflate.
27 июл 20, 15:14    [22174221]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2904
KreatorXXI,

Я думаю есть. Разные редакторы выдают идентичный png разного размера
27 июл 20, 15:17    [22174224]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Sapersky
Member

Откуда:
Сообщений: 66
SOFT FOR YOU,

Ну если не лень за 5% гоняться, то конечно.
А у меня обычная практика - в большом проекте оптимизируешь какую-то часть на 50%, и результирующее улучшение как раз 5%. А если оптимизируешь на 5%, то это вообще незаметно.

Для выравнивания кода на высоком уровне есть директивы:
https://easyperf.net/blog/2018/01/18/Code_alignment_issues
https://easyperf.net/blog/2018/01/25/Code_alignment_options_in_llvm

movups на выровненных данных = movaps начиная с первых Core i (Nehalem).
27 июл 20, 16:01    [22174253]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2904
Sapersky,

Это Move
Святое дело - гоняться даже за 5% )
Насчёт ссылок. У меня выравнивание функций 16 стоит. Некоторые я специально выравниваю на 64. Надо делать локальное выравнивание в некоторых местах. А не везде
27 июл 20, 16:11    [22174257]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
zedxxx
Member

Откуда:
Сообщений: 17
KreatorXXI
У png нет настраиваемой степени сжатия. Всегда одно - сжатие без потерь по алгоритму Deflate.

Этим алгоритмом можно сжимать с уровнем от 0 (без сжатия) до 9: Deflate encoder/compressor

автор
During the compression stage, it is the encoder that chooses the amount of time spent looking for matching strings. The zlib/gzip reference implementation allows the user to select from a sliding scale of likely resulting compression-level vs. speed of encoding. Options range from 0 (do not attempt compression, just store uncompressed) to 9 representing the maximum capability of the reference implementation in zlib/gzip.


А, например, вот у этой библиотеки libdeflate есть целых 12 уровней, чтобы каждый мог подобрать себе идеальное соотношение скорость/размер архива.

Сообщение было отредактировано: 27 июл 20, 18:04
27 июл 20, 17:59    [22174324]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Delphi Ответить