Mazmunga o'tish
Tez Base

Обработка на Инфостарте

Бенчмарк: код 1С против внешней компоненты на C++ на вашем сервере

Прежде чем переписывать медленное место на C++, его стоит померить. Обработка решает одни и те же задачи на встроенном языке и внешней компонентой, сверяет результаты и показывает, где компонента выигрывает в сотни раз, а где проигрывает лучшему коду 1С. Компонента лежит внутри обработки, класть файлы на сервер не нужно.

Обработка продаётся на Инфостарте за 10 SM, код открыт. Управляемые формы, компонента собрана под Windows x64 и лежит в обработке макетом. Замеры сняты на 8.3.27.1606; на 8.3.20 и на Linux-сервере обработка не запускалась.

Вопрос "ускорит ли компонента" обычно решают на глаз: интерпретатор медленный, C++ быстрый. На деле время компоненты складывается из трёх частей: подготовки данных в 1С, вызова с передачей через границу и разбора ответа обратно в коллекции. Компонента не умеет вернуть структуру или таблицу значений, и если результат нужен коллекцией, её собирает 1С. На разборе 100 000 записей JSON в массив структур сама компонента работала 52 мс, а сборка структур из её ответа заняла 1 003 мс.

Вторая половина ответа в строке подключения. На 8.3.27 у ПодключитьВнешнююКомпоненту есть параметр ТипПодключенияВнешнейКомпоненты. Без него компонента на нашем стенде работала изолированно, в отдельном процессе: пустой вызов около 123 мкс, миллион символов туда около 90 мс. С НеИзолированно вызов стоит около 4 мкс, но сбой компоненты роняет рабочий процесс 1С.

Обработка меряет обе части на вашем железе. У каждой задачи до трёх вариантов на встроенном языке: как пишут обычно, оптимизированный и платформенным средством, если оно есть. Компонента сравнивается с лучшим из них, а не с наивным кодом.

Что внутри

31 тест в семи группах

Цена вызова и передачи данных, JSON, строки, числа, пакетные преобразования, построчное сравнение текстов, потоки.

Время по фазам

Подготовка в 1С, вызов, разбор ответа: видно, куда ушло время, когда компонента проиграла.

Проверка одинаковости

Каждый вариант приводится к каноническому виду и сверяется по MD5. Тест, где хоть один вариант дал другое, в вердикт не идёт.

Лестница объёмов

Каждая задача прогоняется на нескольких объёмах, чтобы увидеть, с какого компонента начинает окупаться.

Режим подключения на выбор

Как решит платформа, изолированно или в процессе 1С. Результат сохраняется в JSON вместе с описанием окружения.

Десять выигравших ядер как функции

Итоги и переименование полей JSON, разбор CSV, итоги дат и чисел, поиск подстрок, Левенштейн и нечёткие дубли, сравнение текстов, Base64 в обе стороны. Без компоненты они считают тот же результат на встроенном языке.

Что показал стенд

Windows 10 x64, Core i7-9750H (6 ядер, 12 потоков), 16 ГБ, платформа 8.3.27.1606, клиент-серверная база, сервер без отладки. Лучший вариант на 1С против компоненты в процессе 1С и изолированно, медиана пяти повторов.

Показатель Значение Как надо Вердикт Что это значит
Пустой вызов 4 мкс в процессе, 123 мкс изолированно - инфо пустая процедура на 1С около 1,4 мкс
Рюкзак 0/1, вместимость 50 000 6 252 мс против 5 мс - норма мало входа, много арифметики: изоляция почти не мешает, 4,8 мс
Нечёткие дубли, 1 000 наименований 1 403 мс против 6 мс - норма изолированно 16 мс; на 1С уже с индексом триграмм
JSON в JSON с переименованием, 100 000 записей 1 376 мс против 49 мс - внимание выигрыш 28 раз только в процессе 1С; изолированно 1 612 мс, медленнее 1С
JSON в массив структур, 100 000 записей 590 мс против 1 133 мс - чинить проигрыш: 1 003 мс из 1 133 ушло на сборку структур из ответа
Регулярное выражение, 10 млн символов 440 мс против 3 476 мс - чинить std::regex медленнее движка платформы, СтрНайтиВсеПоРегулярномуВыражению вне конкуренции
Квадрат числа вызовом на каждое, 100 000 95 мс против 546 мс - чинить поэлементный вызов: изолированно 7 930 мс
Монте-Карло 50 млн точек, потоки 372 мс в 1 поток, 42 мс в 12 - инфо в 9 раз на шести физических ядрах; число потоков - параметр, по умолчанию 1

Разбор результата

Компонента выигрывает в двух случаях: почти пустой вход и много арифметики (рюкзак, моделирование, попарные расстояния) или текст на входе и короткий итог на выходе (агрегаты, поиск, сравнение текстов), второе только в процессе 1С. Проигрывает, когда результат нужен коллекцией или когда у задачи уже есть платформенная функция. Полная таблица с объёмами окупаемости и чек-лист перед написанием компоненты разобраны в статье блога.

Как запустить

  1. 01

    Открыть в копии базы

    Клиент-серверная база, не в безопасном режиме. Замеры грузят сервер, рабочую базу лучше не трогать.

  2. 02

    Проверить строку о компоненте

    В шапке формы видно, подключилась ли компонента и в каком режиме, или почему нет.

  3. 03

    Выбрать тесты и режим

    Отметить группы, число повторов, ступени объёма и режим подключения, нажать "Запустить замеры".

  4. 04

    Сохранить результат

    "Сохранить results.json" пишет все замеры и описание окружения. Вкладка "Где нативка выигрывает" показывает цифры стенда и советник: задача и объём на входе, оценка времени 1С и компоненты в обоих режимах на выходе.

O'zingiz hal qila olmayapsizmi? Yozing, birga ko'ramiz

1C nega sekin ishlayotganining haqiqiy sababini va uning ishini qanday tezlashtirish mumkinligini topamiz - taxmin bilan emas, texnologik jurnal va soʻrov rejalari orqali. Hujjat oʻtkazish, hisobotlar va almashinuvlarni bir necha barobar tezlashtiramiz. Qozogʻiston va MDH boʻylab masofadan.

Narxi
150 000 ₸ danloyiha uchun; soliqlarsiz; bepul auditdan keyin qat'iy belgilanadi
"ogʻir" operatsiyalar boʻyicha odatiy natija
soatlar → daqiqalar

Рядом по теме

Ko'p so'raladigan savollar

Почему компонента без параметра подключения такая медленная?

На 8.3.27 без четвёртого параметра ПодключитьВнешнююКомпоненту наша компонента работала как с явным Изолированно: в отдельном процессе, каждый вызов через обмен между процессами. Пустой вызов около 123 мкс против 4 мкс в процессе 1С.

Чем опасен режим НеИзолированно?

Сбой компоненты роняет рабочий процесс 1С вместе с сеансами на нём. Для своей проверенной компоненты это разумная цена за скорость, для чужой или сырой лучше изоляция.

Почему компонента проиграла на разборе JSON?

Компонента возвращает только строку, число или двоичные данные. Массив структур из её ответа собирает 1С, и на 100 000 записей это 1 003 мс из 1 133. ПрочитатьJSON делает ту же работу внутри платформы за 590 мс.

Работает на Linux?

Компонента собрана только под Windows x64, на Linux-сервере обработка не проверялась. По замыслу, если компонента не подключилась, варианты с ней отключаются, а функции обёртки считают результат на встроенном языке. Этот путь на стенде не проверялся.

Можно использовать ядра в своём коде?

Да, десять функций вызываются из модуля обработки: ИтогиПоКлючуJSON, ПереименоватьПоляJSON, РазобратьCSV, ИтогиДатИЧисел, ЧислоВхождений, РасстоянияЛевенштейна, НечеткиеДубли, СравнитьТексты, Base64Закодировать и Base64Раскодировать. Режим подключения выбирается до первого вызова.

Насколько цифрам стенда верить на моём сервере?

Абсолютные миллисекунды зависят от железа и настроек сервера: под отладкой встроенный язык был у нас в 2,8-4,6 раза медленнее. Поэтому обработка и сделана: прогон на своём сервере даёт свои числа, а не наши.

1C tizimingiz uchun bepul ekspress-audit

1-2 kun ichida bazangizni ko'rib chiqamiz, unumdorlik qayerda yo'qolayotganini topamiz va nima qilish kerakligini aytamiz. Majburiyatsiz.

Bepul ekspress-audit olish

Vazifani muhokama qilamiz

Eng tezi WhatsApp: vazifa haqida bir-ikki qator yozing, ish kuni davomida javob beramiz.

[email protected]

Arizani forma orqali qoldirish qulayroq