Цель:
1. ускорить расчет факториала числа
2. научиться распараллеливать вычисления с помощью фоновых заданий
Предисловие
Всем привет!
Решил протестировать расчет факториала деревом через параллельные вычисления. Про задачу читайте здесь Факториал числа N = N!
Забегу вперед и скажу, что тесты проводились на клиент-серверной базе, конфигурация Бухгалтерия предприятия, редакция 2.0 на обычных формах, платформа 1С:Предприятие 8.3 (8.3.15.1830), СУБД PostgreSQL. Сведения о процессоре и памяти - в картинках (к сожалению, не знаю как скопировать текст сведений, поэтому вырезал скрин)
Результат меня обрадовал: классический алгоритм рассчитал факториал для 50 000 за 17 сек, алгоритм деревом - за 9 сек. Параллельное вычисление в 4 потока за 0 сек. Напишу за 1 сек, поскольку по настоящему я не смог сделать замеры - отловить время завершения фоновых заданий. Я ориентировался на время начала и время завершения фоновых заданий (картинка консоли заданий приложена).
После 50 000, я быстро посчитал в 4 потока 150 000! за 4-5 сек.
Алгоритм. Решение. Распараллеливание.
Фоновые задания как раз предназначаются для организации параллельных вычислений.
Задачу расчета факториала очень удобно распараллелить на несколько потоков вычислений. Причем это касается любого алгоритма для расчета факториала: классического, рекурсией или деревом. Главное разделить всю последовательность чисел на "отрезки", для каждого из которых запускать свой расчет отдельно.
В общем, сначала разделим входные данные: в алгоритме дерева используется разделение последовательности чисел пополам - еще раз пополам и т.д. Применим эту идею для своих целей.
Я решил разделить последовательность (2...ЧислоN) на 4 группы (см. Листинг 1) и расчет по каждой группе запускать в отдельном фоновом задании (см. Листинг 2).
В файловой базе можно тестировать только одно фоновое задание. Или несколько, но они будут будут вставать в очередь и выполняться последовательно. А значит для распараллеливания файловая база не подходит.
Поэтому я развернул алгоритм на клиент-серверной базе. При этом я буду запускать сначала родительское фоновое задание (см. Листинг 3), оно в свою очередь будет запускать 4 дочерних фоновых задания (см. Листинг 4). Листинг 4 содержит все процедуры общего модуля ФоновыеПроцедуры - этого достаточно, чтобы не скачивать прилагаемый ЦФшник.
Обратите внимание на то, что я задействовал Константы для хранения промежуточных результатов. Тип Число для констант ограничен 32 разрядами, поэтому проверку на корректность расчета я проводил для небольших чисел: от 10 до 20, например.
Затем запускал расчет факториала для 50 000 и 150 000. Естественно, результат я видел такой "999 999 999 999 999 ....", но в этом случае интересно было только время работы алгоритма. Платформа 1С, насколько я осведомлен, умножает и хранит в памяти большие числа корректно, а вот с отображением больших чисел имеет проблемы.
Эпилог
Прилагаемую конфигурацию надо запускать в клиент-серверном режиме. Она содержит только общий модуль, обработку с формой для задания числа N и запуска расчета - для тестирования этого достаточно.
В файловом режиме параллельности расчетов не будет. Для завершения фоновых заданий в файловом режиме используйте таймаут (рекомендация синтакс-помощника). Решение задачи на файловой базе не проводил, поскольку цель была именно разделить потоки вычислений.
Если будете тестировать распараллеливание вычислений на базах с обычными формами, то можете использовать типовую КонсольЗаданий.epf для просмотра запущенных, завершенных заданий. Эта консоль заданий находится здесь ИТС. Консоль заданий для обычных форм
Если будете тестировать распараллеливание вычислений на базах с управляемыми формами, то используйте БСП (Библиотеку стандартных подсистем), которая содержит подсистему РегламентныеЗадания и свою консоль заданий Описание подсистем БСП. Регламентыне Задания
На платформе 8.3.15.1830 в синтакс-помощнике вы не найдете описание процедуры ФоновыеЗадания.ОжидатьЗавершения() - но в документации 1С найдете Метод ОжидатьЗавершения() считается устаревшим и не рекомендуется к использованию.
Но я его использовал, поскольку мне показалось это удобным.
Выводы:
1) ускорил расчет факториала числа
2) научился распараллеливать вычисления с помощью фоновых заданий
Собственно, это все.
Лирика, мотивация, кейсы внедрения:
1) Две печатные формы на одном листе
3) Анализ прав и ролей: поиск подходящего профиля
4 ) Оцифровка и визуализация склада
Расширения:
1) [Расширение] УНФ. Список заказов + Структура подчиненности
2) [Расширение] БП 3.0. Список счетов/ Список реализаций + Связанные документы
3) [Расширение] УТ 11.4. Счет на оплату с факсимиле и баннерами
Внешние обработки (не расширения!):
1) Список заказов поставщикам + структура подчиненности
2) Список заказов покупателей + структура подчиненности
3) Список реализаций со структурой подчиненности + реестр документов
4) Список заказов покупателей (Расширенная версия)
Другие публикации:
1) Удаление справочников для любых баз на управляемых формах
2) Удаление документов для любых баз на управляемых формах
3) Удаление чеков ККМ в Рознице 2.2
4) Загрузка товаров, штрихкодов, цен и остатков на УФ - Розница 2.2
5) Отчет Остатки и цены (прайс с остатками)
6) Как свернуть базу УТ 10.3: принципы свертки, технология, вспомогательные обработки
7) [ЦФшник] Доработка конфигурации Конвертация Данных
8) [Внешняя обработка] Ввод показателей план-факта БП 3.0
9) [Шаблоны] Договоры для 1с-ника ТОП-скачиваний
10) Удаление документов для любых баз на обычных формах
11) Выделение документов в списках (обычные формы) для групповой обработки
12) Список номенклатуры с выводом уникального идентификатора для УТ 10.3
Всем добра! :)