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

Откуда:
Сообщений: 319
Вопрос простой, почему код ниже скомпилированный в delphi 7 выполняется за 2.125 секунды, а Delphi 10 за 22.703, более чем в 10 раз дольше. Simple.jpg картинка размером 10000 на 7000 (для примера).

  StartTime := GetTickCount;
    Picture:=TPicture.Create;
    bmp:=TBitmap.Create;

    Picture.LoadFromFile('c:\Simple.jpg');
    bmp.Assign(Picture.Graphic); //по сути всё время выполнения в данной строчке

    Picture.Free;

   StartTime := GetTickCount - StartTime;
   Label1.Caption := Format('Выполнено за %.2u mS', [StartTime]);


Сообщение было отредактировано: 22 июл 20, 22:45
22 июл 20, 22:46    [22172007]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
DimaBr
Member

Откуда:
Сообщений: 11808
F7 не даёт ответ ?
22 июл 20, 22:50    [22172010]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 319
DimaBr
F7 не даёт ответ ?

Все 22 секунды это:
bmp.Assign(Picture.Graphic);

Можно, конечно, внутрь залезть, но не думаю, что я там смогу понять, что да почему.
Во всех примерах в "интернетах" примерно так подгружают Jpeg, ну или сторонние библиотеки.
22 июл 20, 22:53    [22172011]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
rgreat
Member

Откуда:
Сообщений: 6068
Андрей Игоревич
Вопрос простой, почему код ниже скомпилированный в delphi 7 выполняется за 2.125 секунды, а Delphi 10 за 22.703, более чем в 10 раз дольше. Simple.jpg картинка размером 10000 на 7000 (для примера).

  StartTime := GetTickCount;
    Picture:=TPicture.Create;
    bmp:=TBitmap.Create;

    Picture.LoadFromFile('c:\Simple.jpg');
    bmp.Assign(Picture.Graphic); //по сути всё время выполнения в данной строчке

    Picture.Free;

   StartTime := GetTickCount - StartTime;
   Label1.Caption := Format('Выполнено за %.2u mS', [StartTime]);
10000 на 7000 - это почти 300 мегов. Что-то в memory manager-е?

64-битное приложение не пробовали?

Сообщение было отредактировано: 22 июл 20, 22:55
22 июл 20, 22:57    [22172012]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 319
rgreat
10000 на 7000 - это почти 300 мегов. Что-то в memory manager-е?


В Jpeg около 10 Мб, в BMP и памяти где-то 100.
rgreat

64-битное приложение не пробовали?

эээ... 0.563 секунды. Почему...
Ничего не понимаю.
Почему такая разница в 32 и 64, я в эту сторону даже и не думал смотреть...
22 июл 20, 23:02    [22172016]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
zedxxx
Member

Откуда:
Сообщений: 17
Скорость сравниваете для релизных сборок?
22 июл 20, 23:03    [22172017]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 319
zedxxx
Скорость сравниваете для релизных сборок?

Delphi? Торрент эдишн, вроде релизные 7ка точно, 10ка (Version 26.0.36039.7899).

Сообщение было отредактировано: 22 июл 20, 23:04
22 июл 20, 23:06    [22172020]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
zedxxx
Member

Откуда:
Сообщений: 17
Нет. Вы проект собираете в Release или Debug версии?
22 июл 20, 23:06    [22172023]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 319
zedxxx
Нет. Вы проект собираете в Release или Debug версии?

Сейчас прогнал в Reliase - ничего не поменялось. Но разница в 32 и 64 конечно колоссальная.

Сообщение было отредактировано: 22 июл 20, 23:06
22 июл 20, 23:08    [22172024]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 319
...

Сообщение было отредактировано: 22 июл 20, 23:17
22 июл 20, 23:19    [22172029]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
zedxxx
Member

Откуда:
Сообщений: 17
Не знаю, как было в Delphi 7, а в современных версиях, Delphi использует сишную libjpeg для работы с jpeg. Причем, для win32 они компилируют её своим старым С++ компилятором, а для win64 компиляция производится уже LLVM компилятором. Отсюда и возможная разница в скорости win32/win64.

Если вам критична скорость, то посмотрите в сторону libjpeg-turbo (например, вот с этой обёрткой).
22 июл 20, 23:28    [22172033]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
DimaBr
Member

Откуда:
Сообщений: 11808
тынц - через TWICImage 5 сек на XE2, через TJPEGImage - 22 сек
22 июл 20, 23:37    [22172038]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 319
zedxxx
Не знаю, как было в Delphi 7, а в современных версиях, Delphi использует сишную libjpeg для работы с jpeg. Причем, для win32 они компилируют её своим старым С++ компилятором, а для win64 компиляция производится уже LLVM компилятором. Отсюда и возможная разница в скорости win32/win64.

Если вам критична скорость, то посмотрите в сторону libjpeg-turbo (например, вот с этой обёрткой).

Ясно. Спасибо.
DimaBr
тынц - через TWICImage 5 сек на XE2, через TJPEGImage - 22 сек

Спасибо, потыкаю Wic.
22 июл 20, 23:46    [22172042]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 12797
Андрей Игоревич
Вопрос простой, почему код ниже скомпилированный в delphi 7 выполняется за 2.125 секунды, а Delphi 10 за 22.703, более чем в 10 раз дольше.
Потому что TJPEGImage - г..но даже в D7. И по закону жанра стало полным г..ном.
Даже GDI+, явно не заточенный под быстродействие, читает в разы быстрее.
23 июл 20, 01:51    [22172062]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Sapersky
Member

Откуда:
Сообщений: 66
Да, GDI+ в последних Виндах хорошо подтянули, уже не так сильно остаёт от libjpeg-turbo (раза в полтора).
WIC не пробовал и не вижу в нём большого смысла - загрузка файлов там наверняка та же самая, что и в GDI+, но на XP не будет работать (если вдруг понадобится).
Замедление стандартного модуля в 10 раз это конечно странно, возможно сишные obj (которые собст-но и грузят картинку) по ошибке скомпилировали в дебаге.
23 июл 20, 13:25    [22172308]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 12797
Меня все одна мысль терзает: почему бы в движки видеокарт, куда всякую фигню пихают, не вставить прямую отрисовку jpeg-ов? По схеме: кидаешь jpeg (после Хаффман-раскодировки) в видеопамять, и он рисуется на поверхности.
25 июл 20, 22:08    [22173666]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Dimitry Sibiryakov
Member

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

Можно и до. Видюха и с распаковкой справилась бы с её-то многоядерностью...

Posted via ActualForum NNTP Server 1.5

25 июл 20, 22:12    [22173667]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 12797
Dimitry Sibiryakov
Можно и до. Видюха и с распаковкой справилась бы с её-то многоядерностью...
ЕМНИП, распаковка там не параллелится.
25 июл 20, 22:16    [22173668]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
SOFT FOR YOU
Member

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

Текстуры сжимают другими алгоритмами
Собственно они сжатыми в видеопамяти и хранятся
25 июл 20, 23:37    [22173682]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
rgreat
Member

Откуда:
Сообщений: 6068
https://www.fastvideo.ru/info/cuda/cuda-jpeg-decoder.htm

Распаковка JPEG:
GeForce GTX 580 (512 ядер) - 3 ГБайт в секунду

Сообщение было отредактировано: 25 июл 20, 23:52
25 июл 20, 23:54    [22173689]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 12797
rgreat
GeForce GTX 580 (512 ядер) - 3 ГБайт в секунду
ЧТД.
Теперь осталось уговорить MS добавить это в стандарт DirectX.
26 июл 20, 08:06    [22173733]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
SOFT FOR YOU
Member

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

ASTC даёт сжатие до 32 раз
Зачем им jpeg )
26 июл 20, 09:31    [22173746]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
SOFT FOR YOU
Member

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

автор
Декодирование сжатых изображений на видеокарте имеет смысл только при условии распараллеливания задачи. Если алгоритм декодирования последовательный, то использовать видеокарту не имеет смысла, поскольку в этом случае CPU будет во много раз быстрее, чем GPU. Для реализации возможности распараллеливания декодирования нужно ещё на этапе кодирования ставить специальные маркеры перед группами блоков 8х8.
26 июл 20, 09:35    [22173748]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
SOFT FOR YOU
Member

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

Это я к чему говорю. Если кто-то хочет использовать статически прилинкованный код, написанный на Си/С++, например для конвертации jpeg, png, для поддержки TLS того же самого - обращайтесь - я буду помогать чем смогу.
26 июл 20, 11:18    [22173763]     Ответить | Цитировать Сообщить модератору
 Re: Очень долгая распаковка Jpeg в Delphi 10  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 12797
SOFT FOR YOU
rgreat,

автор
Декодирование сжатых изображений на видеокарте имеет смысл только при условии распараллеливания задачи. Если алгоритм декодирования последовательный, то использовать видеокарту не имеет смысла, поскольку в этом случае CPU будет во много раз быстрее, чем GPU. Для реализации возможности распараллеливания декодирования нужно ещё на этапе кодирования ставить специальные маркеры перед группами блоков 8х8.
Хаффман-декодирование можно и на CPU делать (о чем я сразу написал),по сравнению с DCT оно копеечное.
26 июл 20, 11:40    [22173767]     Ответить | Цитировать Сообщить модератору
 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

Откуда: Москва
Сообщений: 12797
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

Откуда: Москва
Сообщений: 12797
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

Откуда: Москва
Сообщений: 12797
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]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить