|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|||||||||||||||||||||
Оптимизация алгоритма20.03.2021, 17:18. Показов 2122. Ответов 42
Добрый день уважаемые фоумчане.
Как-то давеча я создавал тему на форуме http://www.cyberforum.ru/cpp-b... 65826.html, в которой уважаемый L0M помог мне с алгоритмом написания нарезчика бит. В данный момент, проведя эксперименты и тесты, я понял что работает нарезчик достаточно медленно (~ +- 32 сек на массив unsigned char на 2 000 000 000 элементов, ~ +- 76 сек на массив unsigned short на 2 000 000 000 элементов и т.д.) Собственно я и решил после этого что-то своё написать в надежде что битовые смещения работают побыстрее битовых масок (с учетом того, что в отличии от масок битовых смещениями я смогу получать сразу перечень данных), но как-то быстрее не стало, а только медленнее. Что делает нарезчик: - принимать в себя массив указателей или указатель на вектор произвольного целочисленного типа данных и порядок бит (прямой - старший бит становится младшим, обратный - классический машинный вариант). - перепрыгивать через N бит. - дописывать биты (с учетом порядка бит) в конец послупившего буфера N бит, если эти N бит вмещаются в тип данных буфера. - остальной функционал не важен - просто баловство. Прошу помощи в этом деле, может быть я где-то был не прав при написании или что-то ещё. Мне бы секунд до 10 - 20 при любых результатах... Вот исходники нарезчика, алгоритм которого любезно предоставил уважаемый L0M:
P.S.: Самое забавное что под дебагом мой нарезчик побыстрее будет (оптимизация творит чудеса...), а вот в релизе всё становится печально, результаты фиксированно в приделах 110 сек... Добавлено через 2 часа 42 минуты Сделал кое-какие изменения во втором нарезчике (который сам писал), а именно в функции cutBits, которая и требует оптимизации:
Спасибо.
0
|
|||||||||||||||||||||
| 20.03.2021, 17:18 | |
|
Ответы с готовыми решениями:
42
Оптимизация алгоритма Оптимизация алгоритма
|
|
Мозгоправ
|
||
| 22.03.2021, 16:54 | ||
|
У вас планируется numberBits постоянным для каждого заплыва (как сейчас у вас это реализовано в тестовой программе)? Или оно будет плавать от 1 до какого-то предела при каждом вызове cutBits()? Если будет плавать, попробуйте ещё протестировать с рандомным значением numberBits для каждого вызова cutBits(). Если numberBits постоянно для наждого массива данных, то параллелится достаточно просто. Массив "пилится" на куски, кратные НОК(numberBits, sizeof(array_type) * 8) / sizeof(array_type) * 8. Каждый кусок отдаётся на обработку в отдельный поток. Сколько будет выходных данных для каждого куска - тоже вычисляется. Значит смещение в выходном буфере тоже считается.На уровне идеи: ещё есть векторные инструкции SIMD: всякие SSE, AVX и пр. Может в эту сторону можно подумать.
0
|
||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
||
| 22.03.2021, 17:47 [ТС] | ||
|
Значение numberBits при каждом выполнение будет рандомным, т.к. этот класс направлен на распиливание сырого массива растровых данных формата TIFF, а в соответствии со спецификацией данные могут быть разными, в диапазоне от 1 - 64 бит на один цветовой канал изображения.
По поводу фиксированности - тут тоже не все однозначно, есть вероятность встретить растры с разным количеством бит на канал, поэтому вариант с разделением на равные куски не кажется мне удачным. Добавлено через 42 минуты По поводу правдивости моего высказывания о разных значениях количества бит на компонент - Ссылка
0
|
||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|
| 22.03.2021, 18:39 [ТС] | |
|
Как раз решил написать, и для работы, и для себя, ну и для защиты диплома (так сказать актуальность выражена в возможности читать файлы с произвольным количеством бит на канал изображения). И именно для этого мне и нужен битовый нарезчик дабы обойти это ограничение, которое присутствует в LibTiff, ну и плюсом в LibTiff нет удобного интерфейса для работы с содержимым файла.
Собственно вот такие дела.
0
|
|
|
Мозгоправ
|
|||
| 22.03.2021, 19:38 | |||
![]() Посмотрел я на краткое описание TIFF в Википедии... Но, как говорится, вода камень точит... При чтении "по диагонали" зацепился за один раздельчик:
В полоске (aka стрипе) данные скомпрессированы. (Компрессоры/декомпрессоры всех задекларированных в стандарте TIFF форматов сжатия вы тоже будете сами писать? Или всё-таки воспользуетесь готовыми решениями?). Вопрос: после декомпрессии данные по каналам тоже будут в виде потока бит? Или всё же будут выровнены по границе байта? Это два. Это я к тому, что может можно обойтись малой кровью в плане cutBits()? PS. Я ни разу не специалист по TIFF и вообще по обработке изображений, а также по алгоритмам компрессии.
0
|
|||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
||||||
| 22.03.2021, 19:56 [ТС] | ||||||
|
Да, Вы правы, данные растра выравнены до границы байта. Но есть нюанс, заключается он в том, что есть два варианта расположения данных в файле (за это отвечает тег PlanarConfiguration[284]):
- данные лежат подряд (на примере с цветовым пространством RGB - ...RGBRGBRGB...). - данные лежат поканально(на примере с цветовым пространством RGB - ...RRR... ...GGG... ...BBB...). А данные я буду возвращать пользователю в объектах (спецификация определяет "Полосы" и "Плитки"(Тайлы)), которые уже будут содержать в себе данные нарезанные поканально и разложеные по минимальной единице - байту Ну и соответственно такое архитектурное решение накладывает ограничения. В теории я мог бы многопоточно читать данные, но возникнут сложности с размещением данных в моих объектах. Пока реализую так как задумал, точнее перепишу что наваял в черновом варианте. Добавлено через 7 минут По поводу схем распаковки, думаю писать их сам, не очень хотелось бы тянуть за сабой кучу всего, да и при этом подавляющее большинство данных которые я буду читать запакованы LZW и PackBits. Вторую схему я уже накидал, вот к примеру:
0
|
||||||
|
Мозгоправ
|
||
| 22.03.2021, 19:59 | ||
|
0
|
||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|
| 22.03.2021, 20:03 [ТС] | |
|
Да, тут вы правы, если совсем честно, то с многопоточностью у меня не очень, может как-нибудь руки дойдут, но не сейчас, сроки поджимают.
0
|
|
|
Мозгоправ
|
|||
| 22.03.2021, 20:25 | |||
![]() Во-первых, чисто технически. Почему функция возвращает bool? "Не шмогла"? Далее, смотрим if-ы в цикле: -128 - понятно, от -127 до 0 - понятно, от 0 и больше - понятно. Строки 23-24 в каком случае будут выполнены? Цикл for с модификацией переменной цикла внутри тела цикла - не лучшая идея. Цикл while с явным инкрементом IndexPackString в нужных местах здесь будет уместнее. Во-вторых, std::vector.insert() может вызывать перераспределение памяти. Это дорогая операция. Поэтому, если вам известно количество распакованных данных (по размеру стрипа/тайла/строки/изображения), то лучше заранее через std::vector.resize() выделить необходимое место. А данные потом копировать через обращение по индексу или вообще вызовом memset или memcpy.Добавлено через 1 минуту
0
|
|||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|
| 22.03.2021, 20:32 [ТС] | |
|
По первому, да, именно так - угадали.
По второму, вообще не выполнятся, работа ведь происходит со знаковым целым 8 битным. На счет выделения, да, разумно. Спасибо что указали на косяки, давно эту функцию не смотрел.
0
|
|
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|
| 22.03.2021, 20:52 [ТС] | |
|
то возвращаемое значение вообще бесмысслено делать для этой функции, либо если есть нюансы связанные с проверкой длины исходного массива, то в таком случае нужно.
0
|
|
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|
| 22.03.2021, 21:03 [ТС] | |
|
И снова благодарю Вас за мудрые наставления!
0
|
|
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|
| 22.03.2021, 21:24 | |
|
Aringot, а разве из поста про который упоминалось в шапке, не видно о том что структура файла байтовая.
И из отрывка я не понял что за формат такйо при котором нужно работать над битами как над отдельной структурой. ? Добавлено через 1 минуту Я хочу сказать что такие манипуляции делаются только при чтении/записи файла, но не при обработке.
0
|
|
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|
| 22.03.2021, 21:26 [ТС] | |
|
SmallEvil, теговая структура файла байтовая, но данные растра могут иметь размер цветовой компоненты которая меньше одного байта.
Так я файлы данного формата собираюсь читать и отрисовывать, возможно писать(но это не точно).
0
|
|
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|
| 22.03.2021, 21:32 | |
|
Aringot, понятно, что мешает обойтись без нарезки ?
економия озу ? или это алгоритм декомпрессии ?
0
|
|
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|
| 22.03.2021, 21:38 [ТС] | |
|
В растре данные идут подряд, то есть без выравнивания до байта, выравнивание есть только между концом и началом новой строки изображения.
Как я уже упоминал ранее, формат поддерживает различное количество бит на цветовую компоненту (например: 4,5,4 бит для RGB или 3,4,4 бит и т.д.), а идея в том, что бы эти данные разложить в приделах минимально вместимого типа данных. Таким образом речь о какой-либо экономии озу не идёт, экономиться она будет с помощью произвольного чтения по номеру объекта изображения (строки/тайла), а не чтения целого изображения.
0
|
|
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
||
| 22.03.2021, 21:40 | ||
|
ладно, завтра ознакомлюсь с форматом . дайте спецификацию, точное название формата.
0
|
||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|
| 22.03.2021, 21:44 [ТС] | |
|
0
|
|
| 22.03.2021, 21:44 | |
|
Помогаю со студенческими работами здесь
40
Оптимизация алгоритма Оптимизация алгоритма быстрого поиска Оптимизация алгоритма вычисления определителя матрицы Оптимизация алгоритма нахождения максимального элемента Оптимизация алгоритма перемножения двух матриц Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 31.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 31.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 30.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|