|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|||||||||||||||||||||
Оптимизация алгоритма20.03.2021, 17:18. Показов 2120. Ответов 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
Оптимизация алгоритма Оптимизация алгоритма
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||
| 20.03.2021, 22:18 | |||
|
0
|
|||
|
Мозгоправ
|
|
| 20.03.2021, 22:32 | |
|
Aringot, если уж меня не к ночи помянули, то все оптимизации начинаются с выявления "бутылочного горлышка". Что обычно делается профайлером. Это во-первых.
Во-вторых, попробуйте в вашей программе сделать всё то же самое, но без обработки. Т.е. нарезчик должен работать вхолостую: что получил, то и отдал. И посмотрите сколько это потребует времени на ваших тестовых данных. Может банально ввод-вывод тормозит? В-третьих, конечно, пробуйте оптимизировать узкие места, найденные в п.1. Кстати, очень подозрительно, что дебаг у вас работает быстрее, чем релиз. В-четвёртых, смотрите в сторону многопоточной обработки данных. В-пятых, смотрите в сторону многопоточной обработки данных на GPU.
0
|
|
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|||||||||||||||||
| 20.03.2021, 22:34 [ТС] | |||||||||||||||||
Или же другая ситуация, я до этого получил 3 бита, и, соответственно, у меня осталось 5 бит на текущий элемент, которые я могу взять, а мне надо больше. В итоге такая же ситуация, мне за один раунд столько не взять, и нужен следующий элемент.
0
|
|||||||||||||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 20.03.2021, 22:37 | ||
|
0
|
||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
||||||||||||||||||
| 20.03.2021, 22:48 [ТС] | ||||||||||||||||||
|
Доброй ночи, L0M,
Добавлено через 3 минуты в своей реализации я узкое место нашёл:
Добавлено через 4 минуты
0
|
||||||||||||||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||||||||
| 20.03.2021, 22:55 | ||||||||
0
|
||||||||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||
| 20.03.2021, 23:00 | ||
uint8_t[256])
0
|
||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|
| 20.03.2021, 23:02 [ТС] | |
|
oleg-m1973, вариант годный, а это, в таком случае, нивелирует необходимость держать в классе указатель на вектор, а лишь только на тип данных, ну и switch тоже выбросить можно будет, но необходимость проверки это никак не уберет, всё - таки мне необходимо убедиться что были получены все биты текущего элемента и, соответственно, получить следующий.
Добавлено через 2 минуты zayats80888, вариант хороший, ну и для 1 байтового, ну и 2 байтового типа написать это дело можно, но чем дальше, тем страшнее.
0
|
|
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||
| 20.03.2021, 23:04 | ||
|
0
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||
| 20.03.2021, 23:04 | |||
|
1
|
|||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|
| 20.03.2021, 23:05 | |
|
0
|
|
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
||
| 20.03.2021, 23:10 [ТС] | ||
|
0
|
||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||
| 20.03.2021, 23:14 | ||
table[n] хранит инвертированный порядок бит для значения n. Нужно инвертировать 2-байтовое значение? Инвертируете биты в каждом байте с помощью таблицы и переставляете сами байты.
1
|
||
|
Мозгоправ
|
|||
| 20.03.2021, 23:20 | |||
|
0
|
|||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|||||||||||||||||||||
| 21.03.2021, 15:56 [ТС] | |||||||||||||||||||||
|
oleg-m1973, сделал как вы и предлагали, но без шаблонов (т.к. до меня не дошло как я могу написать шаблон, который при определенных условиях строки генерирует, а при определенных нет, либо я Вас не так понял)
вот вариант с масками:
L0M, надеюсь Вы имели ввиду что-то вроде этого:
0
|
|||||||||||||||||||||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|||||||||||||||||||||||||||||||||||||||||
| 21.03.2021, 21:26 [ТС] | |||||||||||||||||||||||||||||||||||||||||
|
На момент тестов функции трех вариаций нарезчиков имеют следующий вид:
Нарезчик (маски):
Тесты на полноценных функция во вложениях.
0
|
|||||||||||||||||||||||||||||||||||||||||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|
| 21.03.2021, 23:58 [ТС] | |
|
Будут ли какие - нибудь предложения по корректировке уже написанного или что-либо ещё ?
0
|
|
|
Мозгоправ
|
||
| 22.03.2021, 15:24 | ||
|
Ну и в пп. 4 и 5 в #3 я вам уже писал, куда можно двигаться дальше.
1
|
||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
||||||
| 22.03.2021, 15:39 [ТС] | ||||||
|
Добрый день, L0M, по поводу комбинирования вариантов - наверное это не самая лучшая идея, она ведь повлечет появления ветвления уже на начальных этапах, конечно это можно протестировать, но у меня на этот счет сомнения.
Вот самый быстрый и короткий в написании вариант(не считая варианта с 1 битом, но и там разрыв не такой уж и большой):
Добавлено через 8 минут Всем спасибо за подсказки. oleg-m1973, если заглянете в эту тему, то напишите пожалуйста что Вы тогда имели ввиду говоря о шаблоне к функции? Не совсем понял о чем вы, толи про вариативный шаблон, толи ещё про что-то.
0
|
||||||
| 22.03.2021, 15:39 | |
|
Помогаю со студенческими работами здесь
20
Оптимизация алгоритма Оптимизация алгоритма быстрого поиска Оптимизация алгоритма вычисления определителя матрицы Оптимизация алгоритма нахождения максимального элемента Оптимизация алгоритма перемножения двух матриц Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.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(), которая. . .
|