Методика применения однострочного кода

21.06.23

Разработка - Инструментарий разработчика

Уже много лет не утихают споры о полезности однострочного кода. Разберемся с этими вопросами подробно. Когда полезен однострочный код и как правильно его применять.

Скачать файлы

Наименование Файл Версия Размер
Методика применения однострочного кода
.epf 19,42Kb
24
.epf 19,42Kb 24 Скачать бесплатно

Обработка "конца строки" при выполнении кода

Для начала нам нужно разобраться, когда количество строк в коде имеет значение.

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

- проверка отладчика (при разрешенной в процессе 1С отладке) - самая тяжелая операция
- на клиенте предотвращается "замерзание" интерфейса
- на сервере отслеживается потеря связи с клиентом и запрос завершения соединения от администратора
- возможно еще каких то задач

Назовем эти действия условно "служебные проверки".

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

Важно запомнить, что самая тяжелая проверка отладчика выполняется независимо от того, подключен ли отладчик к процессу с разрешенной отладкой. Эта проверка не выполняется только когда отладка запрещена. При подключенном же отладчике кроме проверки отладчика еще выполняются дополнительные действия, но обычно относительно легкие.

Выполнение служебных проверок обычно незаметно, т.к. составляет очень небольшой процент от длительности тяжелой команды встроенного языка (например запроса к серверу СУБД).

Однако иногда встречаются участки кода состоящие только из легких команд встроенного языка и выполняющиеся огромное число раз. В таких случаях служебные проверки могут занимать значительный процент времени работы кода и даже бОльшую его часть. Соответственно чем меньше будет строк в таких участках кода, тем ощутимо ниже будет вклад служебных проверок в длительность выполнения.

Так как проверка отладчика является явным лидером по длительности и выполняется только при разрешенной отладке, то рассмотрим способы управления разрешением отладки.

 

Как запретить отладку клиентского приложения?

При запуске из конфигуратора нужно в параметрах снять флажок "Устанавливать режим разрешения отладки" и запустить приложение кнопкой "1С:Предприятие (CTRL+F5)"

 

  

 

При независимом запуске клиентского приложения нужно открыть параметры. Если параметр "Отладка в текущем сеансе" НЕ равно "Не разрешена", то нужно в параметре "Отладка при перезапуске" установить "Не разрешать", нажать ОК и перезапустить приложение.

 

  

 

Как изменить разрешение отладки на сервере?

Нужно убрать/добавить в строке запуска службы агента сервера 1С параметр "-debug" и выполнить перезапуск службы.
В подсистеме "Инструменты разработчика" это можно сделать в инструменте "Управление службами серверов 1С".

 

 

Компания 1С рекомендует запрещать отладку на сервере с продуктивными базами в частности для исключения влияния проверки отладчика на скорость работы программы. В подавляющей части кода выигрыш от ее запрещения будет незаметным и может быть даже проигрыш в некоторых сценариях. Но редкие участки кода, обладающие указанными в первом разделе особенностями, могут действительно сильно замедляться и не только на сервере. Далее мы рассмотрим пример такого кода.

Чтобы понять, что отладка на сервере разрешена, не имея к нему доступа, обычно достаточно в параметрах конфигуратора указать правильный протокол отладки

 

 

и запустить из него на отладку управляемое клиентское приложение и в окне "Предметы отладки" увидеть наличие/отсутствие предметов отладки типа "Сервер"

 

 

Пример замедления при разрешенной отладке

Возьмем код загрузки данных в память из свежей статьи на этом же сайте

	КоличествоСтрок = 100000;
	СтрокаДанных = "pyterochka;75779.04;46907.27;21/1/2012";
	ВремяНачала=ТекущаяУниверсальнаяДатаВМиллисекундах();
	ТаблицаДанных=Новый ТаблицаЗначений;
	ТаблицаДанных.Колонки.Добавить("ИмяМагазина"); 
	ТаблицаДанных.Колонки.Добавить("Дебит");
	ТаблицаДанных.Колонки.Добавить("Кредит");
	ТаблицаДанных.Колонки.Добавить("ДатаОперации");
	ТаблицаДанных.Колонки.Добавить("МесяцОперации");
	Для Счетчик = 1 по КоличествоСтрок Цикл 
		ТекущиеДанныеМассивом=СтрРазделить(СтрокаДанных,";");
		НоваяСтрока=ТаблицаДанных.Добавить();
		НоваяСтрока.ИмяМагазина=ТекущиеДанныеМассивом[0];
		НоваяСтрока.Дебит=Число(ТекущиеДанныеМассивом[1]);
		НоваяСтрока.Кредит=Число(ТекущиеДанныеМассивом[2]);
		КускиДаты=СтрРазделить(ТекущиеДанныеМассивом[3], "/");
		НоваяСтрока.ДатаОперации=Дата(КускиДаты[2], КускиДаты[1], КускиДаты[0]);
		НоваяСтрока.МесяцОперации=НачалоМесяца(НоваяСтрока.ДатаОперации);
	КонецЦикла;
	ВремяОкончания=ТекущаяУниверсальнаяДатаВМиллисекундах();
	Сообщить(СтрШаблон("Время чтения данных %1 мсек.",Строка(ВремяОкончания-ВремяНачала)));

Цикл в этом фрагменте удовлетворяет условиям чувствительного к разрешению отладки кода:

  • состоит только из легких команд встроенного языка
  • выполняется огромное число раз (высокочастотный)

Эти качества легко проверяются обычным замером производительности отладчика - все строки фрагмента занимают ощутимое и сопоставимое время.

 

 

Выполним этот код на толстом клиенте (для удобства переключения разрешения отладки). Для этого скачиваем приложенную внешнюю обработку и без установки в ней флажков нажимаем кнопку сначала при разрешенной отладке. Теперь запустим новое клиентское приложение с запрещенной отладкой и повторим эксперимент.

Мои результаты

  • при разрешенной отладке 2.3с
  • при запрещенной отладке 1.1с
  • 2-х кратное ускорение при запрете отладки

А например на таком искусственном тесте получим 6-кратное ускорение:

Массив = Новый Массив;
Для Индекс = 0 По 100000 Цикл
  Массив.Добавить(Истина);
КонецЦикла;

Важно понимать, какой процент вносит и сам фрагмент в общую длительность бизнес-операции. Если он не значительный, то такое ускорение будет незаметным на общем фоне и не стоит внимания.

Применяем однострочный код

Ради ускорения этих редких фрагментов кода для всей конфигурации запрещать отладку не хочется. Тут нам поможет однострочная запись кода. Ведь как мы помним из первого раздела, количество символов "КонецСтроки" играет большое значение. Но если просто взять и преобразовать какой то фрагмент кода в однострочный вид, то будут неудобства

  • код потеряет читаемость
  • нельзя будет ставить точки останова и делать пошаговую отладку внутри
  • замер производительности будет показаться только целиком для всей строки
  • когда он выполняется на клиенте, будет "замерзать" интерфейс и не будет работать ОбработкаПрерыванияПользователя()
  • когда он выполняется на сервере, не будет отслеживаться потеря связи с клиентом и запрос завершения соединения от администратора
  • в стеке описания ошибки такая строка будет включаться целиком и будет непонятно какой именно метод из нее вызван, но обычно в таком коде нет вызовов прикладных методов и потому она очень редко попадает в стек ошибки
  • и ряд других неудобств

Чтобы при необходимости оперативно временно устранять эти неудобства, воспользуемся консолью кода из подсистемы "Инструменты разработчика". Вставим в нее код цикла из примера выше и выполним команду "Рефакторинг"/"В однострочный".

 

 

Вот какой код она выдала

_РежимОтладки = Ложь;
Если _РежимОтладки Тогда // Можно менять на Истина в точке останова, например условием ирОбщий.ПрЛкс(_РежимОтладки, 1, 1)
	// Пассивный оригинал расположенного ниже однострочного кода. Выполняйте изменения синхронно в обоих вариантах.
	Для Счетчик = 1 по КоличествоСтрок Цикл 
		ТекущиеДанныеМассивом=СтрРазделить(СтрокаДанных,";");
		НоваяСтрока=ТаблицаДанных.Добавить();
		НоваяСтрока.ИмяМагазина=ТекущиеДанныеМассивом[0];
		НоваяСтрока.Дебит=Число(ТекущиеДанныеМассивом[1]);
		НоваяСтрока.Кредит=Число(ТекущиеДанныеМассивом[2]);
		КускиДаты=СтрРазделить(ТекущиеДанныеМассивом[3], "/");
		НоваяСтрока.ДатаОперации=Дата(КускиДаты[2], КускиДаты[1], КускиДаты[0]);
		НоваяСтрока.МесяцОперации=НачалоМесяца(НоваяСтрока.ДатаОперации);
	КонецЦикла;
Иначе
	// Однострочный код использован для ускорения при разрешенной отладке. Выше расположен оригинал. Выполняйте изменения синхронно в обоих вариантах. Преобразовано консолью кода из подсистемы "Инструменты разработчика"
	Для Счетчик = 1 по КоличествоСтрок Цикл  		ТекущиеДанныеМассивом=СтрРазделить(СтрокаДанных,";");  		НоваяСтрока=ТаблицаДанных.Добавить();  		НоваяСтрока.ИмяМагазина=ТекущиеДанныеМассивом[0];  		НоваяСтрока.Дебит=Число(ТекущиеДанныеМассивом[1]);  		НоваяСтрока.Кредит=Число(ТекущиеДанныеМассивом[2]);  		КускиДаты=СтрРазделить(ТекущиеДанныеМассивом[3], "/");  		НоваяСтрока.ДатаОперации=Дата(КускиДаты[2], КускиДаты[1], КускиДаты[0]);  		НоваяСтрока.МесяцОперации=НачалоМесяца(НоваяСтрока.ДатаОперации);  	КонецЦикла;  
КонецЕсли;

Он состоит из 2-х синхронно изменяемых вариантов кода

  • Многострочный код (Пассивный оригинал) - оригинальный код, в обычном режиме он не будет выполняться
  • Однострочный код - в обычном режиме выполняется он

Синхронное изменение обеспечивается ручным обновлением однострочного варианта кода рассмотренной выше командой консоли кода после изменения пассивного оригинала.

Так мы устранили в постоянном режиме потерю читаемости кода путем добавления небольшого риска несогласованности (можно забыть обновить однострочный вариант кода).

 

Переключение между однострочным и многострочным вариантами

Выбор варианта исполнения кода делается изменением булевой переменной _РежимОтладки. Ее можно менять

  • в точке останова вручную
  • в условной точке останова автоматически, например при подключенном расширении "Инструменты разработчика" условием "ирОбщий.ПрЛкс(_РежимОтладки, 1, 1)"
  • глобально, если присваивать ей везде какой то глобальный флаг

Таким образом мы в рамках конкретного сеанса можем управлять выбором выполнения варианта этого кода.

Вернемся к нашей внешней обработке с примером. Туда уже вставлен наш новый код и флаг выбора варианта связан с флажком "Однострочный код" на форме.

 

Повторяем выполнение примера в режиме однострочного кода

Устанавливаем на форме флажок "Однострочный код" и повторяем тест с разрешенной отладкой и с запрещенной. Мои результаты

  • при разрешенной отладке 1.1с
  • при запрещенной отладке 1.1с
  • длительность не изменилась

 

Вывод

В проведенных тестах мы убедились, что независимо от разрешения отладки однострочный код дает ту же скорость, что многострочный дает при запрещенной отладке. Таким образом нейтрализуется негативное влияние разрешенной отладки на работу легкого высокочастотного кода.

однострочный

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    121626    670    389    

711

SALE! 25%

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 15300 руб.

06.10.2023    7264    21    6    

39

SALE! 20%

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 8000 руб.

10.11.2023    3510    11    1    

33

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2520 руб.

14.01.2013    177729    1073    0    

849

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99339    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18103    6    8    

39

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28099    3    10    

15

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23597    15    15    

32
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. iov 406 25.09.22 22:25 Сейчас в теме
Как всегда полезно.
Windsor77; +1 Ответить
2. пользователь 25.09.22 22:28
Сообщение было скрыто модератором.
...
3. Cmapnep 18 25.09.22 23:19 Сейчас в теме
Интересная информация, спасибо!
Остался вопрос
Фоновые задания без флажка в автоматическом подключении отладки также запускаются в режиме разрешенной отладки?
Т.е. для кода обработчиков регламентных заданий и разных длительных операций оптимизация тоже имеет смысл?
4. tormozit 7136 25.09.22 23:38 Сейчас в теме
(3) режим разрешения отладки в процессе 1С считывается только при его старте и в серверном (рабочем) процессе применяется для всех его потоков. У всех потоков внутри процесса байткод готовится и выполняется по единым правилам. Поэтому все описанное в статье также применимо и к фоновым заданиям.
Cthulhu; Cmapnep; +2 Ответить
5. Rotkiv_Vik 1 26.09.22 00:12 Сейчас в теме
Интереееесно, Спасибо.
6. winapi 60 26.09.22 00:39 Сейчас в теме
Интересно конечно, но когда читаешь такие статьи - думаешь а для чего это все? Код должен быть понятен в первую очередь и экономия на спичках здесь точно не нужна. Если нам критически важна скорость - для этого есть другие языки программирования. А теперь попробуйте вспомнить в типовых конфигурациях или БСП есть однострочный код? :)
al_ret; akocur; kser87; smit1c; ltfriend; alex_sayan; zhuravlev_as; Hogyoku; BaphoBush; SP2000; user765946; Evg-Lylyk; VladC#; mrChOP93; Manoshkin; +15 Ответить
7. vandalsvq 1537 26.09.22 07:24 Сейчас в теме
(6) писать в конфигурации однострочниками не стоит конечно. Хотя бы потому что, конечная цель конфигурации работа в "боевом" режиме. А на "боевом" сервере включать отладку вообще "такое-себе" решение. Не знаю зачем отладка на рабочем кластере может понадобится, ну разве что в крайне экстравагантных случаях.
Но кое-что полезное вынести можно. Например, если у вас есть места хранения кода в базе данных, который потенциально может быть "высокочастотным", то его можно преобразовать в однострочник и так выполнять. Буду пользоваться этим или нет не скажу, но на заметку стоит взять
9. tormozit 7136 26.09.22 07:56 Сейчас в теме
(7) Бывают боевые режимы, когда конфигурация постоянно дорабатывается и регулярно приходится сталкиваться с ошибками в боевом режиме, которые в тестовой базе не воспроизводятся, а исправлять их надо срочно. В таких случаях для диагностики иметь возможность аккуратной (внутри транзакций) отладки кода очень полезно. Но разрешать или не разрешать опять же решает каждая команда для себя в зависимости от многих факторов. Утверждать что разрешение отладки в боевом режиме всегда плохо - недальновидно.
Кроме того есть много сценариев, когда на сервере разработки выполняют тяжелые задачи (например для тестирования), в которых также важна длительность выполнения. И порой на серверах разработки делают даже больше прогонов чем в боевом режиме. Поэтому там ускорение может играть даже бОльшую роль.
smit1c; Bolnov; Windsor77; lmm; Восьмой; Yashazz; RuSeek; mrChOP93; shard; echo77; ardn; Somebody1; +12 Ответить
11. vandalsvq 1537 26.09.22 08:35 Сейчас в теме
(9) Серега, ты опытный разработчик, спорить с тобой дело неблагодарное. Но надо ведь понимать, что дозволенное для тебя и под твоим присмотром не стоит повторять неокрепшим духом юнцам. Да и разработка бывает разной. Инхаус предполагает доступ к рабочим лошадкам, а вот аутсорс часто приводит к тому, что есть шанс никогда не увидеть живую эксплуатацию твоей системы. У нас даже данные для теста порой предоставляют в обфусцированном виде или через РДП под присмотром СБ, на машине где нет не только отладки, но банальный буфер обмена отключен.
Я просто привык так жить, поэтому (наверное) для меня нет нужды на рабочем сервере в отладке. А вот на тестовой машине что только не происходило, и с последним абзацем соглашусь безоговорочно

Пы.сы. жизнь без отладки боль !!!
14. ivanov660 4330 26.09.22 09:30 Сейчас в теме
(11)Автора уважаю, но лично я против таких вот однострочных вставок вообще в любых конфигурациях. Минусы данного подхода перекрывают все возможные плюсы.
Для научно познавательного интереса статья подходит, а вот не оказалась бы примером для подражания. И так от кодинга типовых конфигураций кровь в жилах стынет.
Может в начале статьи сделать предупреждение: "Осторожно! Все 'трюки' выполнены профессионалами. Не повторять в реальной конфигурации")
Vedington; akocur; almierm; strange2007; zfilin; mRconik; Irwin; so-quest; ixijixi; gigapevt; unichkin; alex_sayan; +12 Ответить
50. alex_sayan 27.09.22 13:59 Сейчас в теме
(9)
Бывают боевые режимы, когда конфигурация постоянно дорабатывается и регулярно приходится сталкиваться с ошибками в боевом режиме, которые в тестовой базе не воспроизводятся, а исправлять их надо срочно


Ой-ёй. Это уже бардак в разработке
58. e.kogan 1892 28.09.22 09:14 Сейчас в теме
(50) И административный бардак, когда годами говоришь начальству, что на зоопарк из десятка боевых баз типовых конфигураций, нескольких уникальных и ещё сильно пилёная основная учётная ОДИН программист, который даже по должности не программист, а системный аналитик, и ноль поддержки кроме сисадминов - мало... но "бюджета нету"
user1201514; Восьмой; +2 Ответить
8. tormozit 7136 26.09.22 07:41 Сейчас в теме
(6)
Где я предложил писать непонятный код? Укажи конкретное место.
Экономия времени тут относительная и коэффициенты ускорения 2-6 называть "спичками" некорректно. Если выполнение занимало 6ч и мы его снизили до 1-3ч, то ощутить это смогут думаю все кроме тебя. Однако такие участки кода встречаются довольно редко, о чем в статье я опять же писал. Если выполнение занимало 60мс и мы его ускорили до 10-30мс, то применять описанный в статье прием действительно неоправданно.
Я не писал в статье, что нам критически важная скорость в целом. Я описал методику и редкие встречающиеся условия, в которых она дает существенное точечное ускорение без перехода на другие языки программирования.
Про БСП не совсем понятно. Почему именно БСП? Почему не ERP? Почему не любая другая конфигурация?
Я подробно описал возможность с ее преимуществами и всеми недостатками, проверяемую готовым тестом. Дальше каждый решает сам. Тебе она не понравилась и ты будешь применять другие языки программирования, либо просто не будешь ускорять код 1С при наличии такой возможности. Это твой выбор. Я принимаю его :)
Vedington; nyam-nyam; e.kogan; ZhikinVN1984; +4 Ответить
10. N_K_S 43 26.09.22 08:02 Сейчас в теме
12. starik-2005 3033 26.09.22 09:19 Сейчас в теме
Есть мнение, что однострочный код и без режима отладки работает быстрее.
13. tormozit 7136 26.09.22 09:28 Сейчас в теме
(12) Это так. В первом разделе я описал действия, которые выполняет опкод новой строки. Проверка отладчика - самая тяжелая часть, но есть и другие легкие проверки. Они тоже занимают какое то время. Но даже для очень легких инструкций оно не превышает 10%. Поэтому я не стал его рассматривать.
15. starik-2005 3033 26.09.22 09:48 Сейчас в теме
(13) Я как-то число Фибоначчи вычислял, сравнивая разные стеки, так вот на 1С с отладчиком код работал 18 секунд, без отладчика 4 с чем-то, в одну строку 3,22 (т.е. 25% разницы), на питоне - 1,8, на php 0,72, на С без оптимизации 0,14, с оптимизацией -OFast 0,03, на ассемблере в развернутом целочисленном цикле (2 регистра по 64 бита на член, т.е. 128-битная арифметика) еще в 2 примерно раза быстрее. Вот как-то так.
b1waver; FAMыч; eternium; e.kogan; shard; adamx; +6 1 Ответить
16. tormozit 7136 26.09.22 09:53 Сейчас в теме
(15) "С отладчиком" и "без отладчика" - не достаточно четкие условия. Есть 2 параметра: "подключенный отладчик" и "разрешение отладки". Что из этого входит в твои условия и как это связано с (13)?
18. starik-2005 3033 26.09.22 09:54 Сейчас в теме
(16)
не достаточно четкие услови
Ну т.е. если вдруг у меня отладчик был не отключен совсем, то если бы я его вообще отключил, получил бы не 25%, а 146%? )))
20. starik-2005 3033 26.09.22 10:06 Сейчас в теме
(16) Нашел то обсуждение: http://forum.infostart.ru/forum9/topic214571/message2239298/#message2239298
Чуть ниже:
18 747 против 14 656 миллисекунд... лучше конечно, но не принципиально... всю программу в таком стиле не напишешь...
вы, наверное, из конфигуратора под отладчиком запускали... поэтому у вас могла большая разница получиться...

Ну и вот:
ну не знаю... сейчас запустил вашу обработку FIB.epf и получил 9 644, т.е. близко к вашему результату... но все равно на секунду медленнее...
сравнил код... у вас все в одну строку, а у меня только циклы были в одну строку... и уже давало 14 656... это не 1с, а ребус какой-то... :)

Ну и вишенка на торте:
кстати, убрал пробелы - стало еще быстрее (это, кстати, на тему именования переменных - чем длиннее имя переменной, тем дольше работает 1С походу):
32. SerVer1C 748 26.09.22 13:28 Сейчас в теме
(20)
кстати, убрал пробелы - стало еще быстрее
- это фикция. Потому что на выходе получится один и тот же оп-код. С длиной имен переменных тоже не соглашусь (хотя и не проверял).
36. starik-2005 3033 26.09.22 18:12 Сейчас в теме
(32)
не проверял
Ну так вперед! Расскажете потом, ибо кода проверял я, то зависимость от длинны строки некоторым образом ощущалась через измерение количества времени, потраченного на вычисления.
38. SerVer1C 748 26.09.22 18:27 Сейчас в теме
(36) Увы... Практика показала, что наличие пробелов и длинные имена переменных никак не влияют на быстродействие выполняемого кода. (что естественно для всех языков программирования)
17. VdZMWOnC 106 26.09.22 09:54 Сейчас в теме
Добрый день
В подавляющей части кода выигрыш от ее запрещения будет незаметным и может быть даже проигрыш в некоторых сценариях

а о каких сценариях идет речь?
19. tormozit 7136 26.09.22 10:01 Сейчас в теме
(17) Загрузка контекста (метаданных) базы в рабочий процесс при разрешенной отладке выполняется плавно, т.е. мелкими порциями нужные метаданные загружаются, а при запрещенной отладке вся конфигурация целиком сразу грузится. Поэтому выполнение кода в первых соединениях базы в рабочем процессе при разрешенной отладке для больших конфигураций начинается заметно быстрее, т.к. нет длительного ожидания загрузки всей конфигурации в рабочий процесс.
VdZMWOnC; +1 Ответить
37. VdZMWOnC 106 26.09.22 18:17 Сейчас в теме
(19)
Сергей, я думаю что это сильно надумано чтобы отнести к реальному сценарию, в любом случае спасибо за информацию и интересную статью. + Вам в карму и отдельное спасибо за ИР
39. tormozit 7136 26.09.22 18:32 Сейчас в теме
(37) Ну я это не сам придумал. Это информация также собрана из обсуждений в партнерском форуме. Базовое утверждение (про плавную загрузку метаданных) основано на информации разработчиков платформы. Они же допустили наличие таких сценариев, а некоторые участники от партнеров подтвердили их наблюдение и даже осмысленное использование на очень больших конфигурациях (ERP).
21. gybson 26.09.22 10:07 Сейчас в теме
Если на сервере отладка отключена, то данная проблема актуальна для серверного кода или остается только на клиенте?
23. tormozit 7136 26.09.22 10:32 Сейчас в теме
(21) Если это не стало понятно после прочтения статьи, то наверное стоит ее еще раз прочитать, ну или скачать пример и самому его погонять. В нем можно и на сервере и на клиенте тестировать.
22. user625107_barabambler1s 26.09.22 10:25 Сейчас в теме
24. biimmap 1827 26.09.22 10:43 Сейчас в теме
Спасибо за интересный рассказ. Добавилось понимания как работают внутренности.

Но поддержу коллег: НЕ НАДО писать код в одну строку! Это главный вывод который надо сделать по статье.
Irwin; unichkin; alex_sayan; igor-pn; +4 Ответить
33. anosin 29 26.09.22 14:54 Сейчас в теме
(24) подозревани что код в одной строке это не для быстройдействия а для доубства восприятия и чтения не более
41. Vlan 36 27.09.22 07:21 Сейчас в теме
(24) А в чем проблема-то? Хочется поработать с комфортом? Переносим весь текст в Ворд и делаем глобальную замену ";(пробел) " на ";(перевод_строки)". Получаем вполне читаемый код. Надо вернуть? Проделываем обратную манипуляцию.
Я делал подобное в своей конфигурации для велоспорта. Там время выполнения процедур критично. Но, если честно, на практике разницы так и не почувствовал. За секунду успевал 3-х участников фиксировать как в первом случае, так и во втором.
42. tormozit 7136 27.09.22 09:13 Сейчас в теме
(41) Зачем такие сложности? Если уж многострочный вариант потерян, консоль кода (ИР) умеет делать точное преобразование в обратную сторону, т.е. может восстановить оригнальный код из однострочного вида, сделанного собой.
48. Vlan 36 27.09.22 13:34 Сейчас в теме
(42) Это если есть консоль кода. У меня не было. Да и сейчас нет.
44. biimmap 1827 27.09.22 10:31 Сейчас в теме
(41)
А в чем проблема-то? Хочется поработать с комфортом?


не хочется работать с теплокодерами! Надоело! Тем более, как выяснилось, и смысла в этом нет. Критична скорость вот 2 совета:
1. Не нужно писать так:

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать().


можно сразу написать

Запрос.Выполнить().Выбрать()
Если сам результат нужен потом, то у Выборки есть метод Владелец()


2. Не нужно при выполнении условий определять лишние переменные. Т.е.:

УсловиеЗапроса = чего-то там....
Если УсловиеЗапроса Тогда...


Можно сразу написать

Если чего-то там... Тогда


Когда работал в 1С, человек отвечающий за производительность ЕРП говорил так: Если из всего ЕРП убрать лишние строки кода, то ЕРП будет работать процентов на 20 быстрее. И это даже без оптимизации запросов!
Восьмой; e.kogan; +2 2 Ответить
49. Vlan 36 27.09.22 13:39 Сейчас в теме
(44) Записал. А вот интересно, комментарии замедляют работу? Ведь какое-то время все равно затрачивается на их обработку.
54. SerVer1C 748 27.09.22 15:35 Сейчас в теме
(49) Комментарии существуют только до момента компиляции модуля. В байт-коде виртуальной машины их нет.
51. alex_sayan 27.09.22 14:08 Сейчас в теме
(44)
. Не нужно при выполнении условий определять лишние переменные. Т.е.:

УсловиеЗапроса = чего-то там....
Если УсловиеЗапроса Тогда...

Можно сразу написать


Зачем? Чтобы сэкономить 0.00000001 секунду и получить

Если <Адское условие
которое понятно только
с тридцатого прочтения
слева направо,
справо налево
и сверху в низ> Тогда
akocur; Irwin; +2 Ответить
52. biimmap 1827 27.09.22 15:29 Сейчас в теме
(51)
Зачем?


судя по всему, с учетом количества таких мест, это имеет значение. Мысль не моя, за что купил, за то продал. Можно у Дорошкевича спросить)
25. SerVer1C 748 26.09.22 11:29 Сейчас в теме
Тема не нова, почти все обфускаторы выразают (где возможно) первый оп-код. Информация носит больше академический интерес, нежели практическое применение. Если взять какой-то алгоритм из реальной жизни, то прирост от этого будет не значителен, в районе погрешностей. Т. к. основное время занимают выполнения запросов и дальнейшая постобработка данных.
26. starik-2005 3033 26.09.22 11:43 Сейчас в теме
(25)
не значителен, в районе погрешностей
Ну вот, например, есть отличный алгоритм загрузки и проверки списка недействительных паспортов, который в одну строку с минимальными именами переменных работает примерно в 2 раза быстрее, чем в несколько строк. Т.е. условно 10 минут против 20 минут на загрузку. Этот код конечен, поддерживать дальше его не надо, поэтому он вполне себе может быть написан в одну строку с переменными типа "А,Б,Ц".

Если же код написан изначально плохо и будет требовать дальнейшей поддержки, то, конечно, писать его в одну строку нельзя. Более того, чтобы он хоть внешне прилично выглядел, обязательно нужно красиво и емко именовать переменные, делать красивые вертикальные отступы (про горизонтальные вообще молчу - они должны быть в обязательном порядке), писать комментарии. И тогда код уже не будет казаться говнокодом, он будет похож на код типовых, его будет удобно поддерживать и вносить очередные красиво поименованные и с хорошими отступами костыли.

И да, я тут ни разу не иронизирую. Хорошего законченного небольшого кода, который можно написать в одну строку, вообще в мире очень мало. Остальной код, из-за принципиальной невозможности написать его предельно хорошо, нужно обязательно красиво оформлять, чтобы его дальнейшее исправление требовало меньше труда.
3gf; Восьмой; e.kogan; +3 Ответить
27. SerVer1C 748 26.09.22 12:01 Сейчас в теме
(26)
котротый
- это вы меня так назвали? )))) шучу.
Имхо, таких алгоритмов существует на уровне погрешностей по соотношению ко всем алгоритмам.
Не удивлюсь, что если всю типовую, например, ERP написать в 1 строку, то мы выиграем %5 по скорости, но заморочей с поддержкой такого кода отгребем более чем % на 50 )
28. starik-2005 3033 26.09.22 12:11 Сейчас в теме
(27)
таких алгоритмов
Да все уже украдено до нас в части алгоритмов. Программист не придумывает алгоритмы (в большинстве случаев) - он использует давно уже придуманное. Чаще всего это давно придуманное весьма примитивно, но задачу решает.

Если вообще так вот посмотреть, то 1С сделала нам достаточно немало объектов/методов/функций и процедур, которые фактически уже "одна строка кода". Дальше нужно их грамотно использовать и переиспользовать. Есть несколько методологий разработки, которые определяют, как нужно переиспользовать код, в итоге программа сводится к "new app; app.run()';", но и это предпочитают писать в двух строках, а потом еще "app.done();", чтобы подчистить за собой временные файлики.
Восьмой; +1 Ответить
29. starik-2005 3033 26.09.22 12:13 Сейчас в теме
30. SerVer1C 748 26.09.22 12:14 Сейчас в теме
(29) не пойму, как это относится к теме статьи ?
31. starik-2005 3033 26.09.22 12:45 Сейчас в теме
34. user625107_barabambler1s 26.09.22 15:08 Сейчас в теме
Так может вообще через Выполнить() кодить? А что, раз такая возня пошла....
35. Cthulhu 1 26.09.22 17:05 Сейчас в теме
и все-таки не "конец строки", но "завершение оператора, совпадающее с концом строки"
ну или проще говоря, однострочная конструкция:
Массив = Новый Массив; Для Индекс = 0 По 100000 Цикл Массив.Добавить(Истина) КонецЦикла;

- будет выполняться столько же, сколько 2х-строчная конструкция
Массив = Новый Массив; Для Индекс = 0
По 100000 Цикл Массив.Добавить(Истина) КонецЦикла;

(ну типа она псевдо-2х-строчная но на самом деле однострочная)

ЗЫ: и - да, многострочная (в 4 строки по-операторно) аналогичная конструкция выполняется, как и сказал автор, в 6 раз дольше.
Прикрепленные файлы:
(УФ) (тест) Однострочный или многострочный программный код.epf
smit1c; vano-ekt; tormozit; +3 Ответить
40. tormozit 7136 26.09.22 20:10 Сейчас в теме
(35) Спасибо. Ценное замечание. Проверил. Дейсвительно код
Массив = Новый Массив
; Для  // Остановка отладчика
Индекс = 0 
По Количество 
Цикл Массив.Добавить(Истина) КонецЦикла; // Остановка отладчика

выполняется так же быстро, как и однострочный.

Обновил соответствующее утверждение в начале статьи.
47. SerVer1C 748 27.09.22 13:09 Сейчас в теме
(40) Провёл небольшое исследование:
В приведенных исходниках цикл начинается на строке №15
Обратите внимание на оп-коды №№ 15, 20, 26
Из этого можно сделать вывод, что для ускорения выполнения кода достаточным условием является расположение операторов "Цикл" и "КонецЦикла" на одной строке в исходнике.
В данном примере прирост скорости на моем компе в 10 раз.
53. SerVer1C 748 27.09.22 15:31 Сейчас в теме
(47) Почему то картинку модеры зарезали, вывожу ее ссылкой
Картинка со сравнением (кликни меня)
55. Rusmus 45 27.09.22 16:55 Сейчас в теме
(40) Значит ли это, что код из статьи, преобразованный в такой:

	КоличествоСтрок = 100000
	; СтрокаДанных = "pyterochka;75779.04;46907.27;21/1/2012"
	; ВремяНачала=ТекущаяУниверсальнаяДатаВМиллисекундах()
	; ТаблицаДанных=Новый ТаблицаЗначений
	; ТаблицаДанных.Колонки.Добавить("ИмяМагазина")
	; ТаблицаДанных.Колонки.Добавить("Дебит")
	; ТаблицаДанных.Колонки.Добавить("Кредит")
	; ТаблицаДанных.Колонки.Добавить("ДатаОперации")
	; ТаблицаДанных.Колонки.Добавить("МесяцОперации")
	; Для Счетчик = 1 по КоличествоСтрок
		Цикл ТекущиеДанныеМассивом=СтрРазделить(СтрокаДанных,";")
		; НоваяСтрока=ТаблицаДанных.Добавить()
		; НоваяСтрока.ИмяМагазина=ТекущиеДанныеМассивом[0]
		; НоваяСтрока.Дебит=Число(ТекущиеДанныеМассивом[1])
		; НоваяСтрока.Кредит=Число(ТекущиеДанныеМассивом[2])
		; КускиДаты=СтрРазделить(ТекущиеДанныеМассивом[3], "/")
		; НоваяСтрока.ДатаОперации=Дата(КускиДаты[2], КускиДаты[1], КускиДаты[0])
		; НоваяСтрока.МесяцОперации=НачалоМесяца(НоваяСтрока.ДатаОперации)
	; КонецЦикла
	; ВремяОкончания=ТекущаяУниверсальнаяДатаВМиллисекундах()
	; Сообщить(СтрШаблон("Время чтения данных %1 мсек.",Строка(ВремяОкончания-ВремяНачала)))
Показать


будет выполняться за то же время, что и однострочный (при включенном разрешении отладки)
56. SerVer1C 748 27.09.22 17:24 Сейчас в теме
(55) Операторы "Цикл" и "КонецЦикла" должны располагаться на одной строке в исходнике.
57. tormozit 7136 27.09.22 17:26 Сейчас в теме
(55) Нет. В этом случае после каждого ";" все равно будет вставлен опкод новой строки, если далее в этой строке начинается инструкция.
43. osa92 61 27.09.22 09:41 Сейчас в теме
Спасибо, познавательно!
Для общего развития полезно)
45. vano-ekt 123 27.09.22 11:38 Сейчас в теме
мы другой вывод сделали - все выгоды от такто/байтодроча, выкроенные ценой читаемости кода, нивелируются выключением отладки на проде 😅
46. tormozit 7136 27.09.22 11:49 Сейчас в теме
(45) Я много раз большие прогоны делал как раз на серверах разработки и тестирования, а не на проде. И сидеть без отладки на проде - такое же "тактодрочерство", т.к. в подавляющей части кода это не дает заметного ускорения, а вот невозможность отладки - весьма чувствительна в острых ситуациях. Так что каждый выбирает подход к "процессу" по обстоятельствам и вкусам.
59. tormozit 7136 28.09.22 19:29 Сейчас в теме
Сделал 4 варианта оформления+компиляции кода "Решето Эратосфена" и замерил их при разешенной и запрещенной отладке. Результаты на картинке. В них заметно
1. Динамически скомпилированный код при запрещенной отладке выполняется в 2 раза медленнее даже в однострочном варианте
2. При разрешенной отладке статически скомпилированный код на 50% медленнее, чем динамически скомпилированный. Это объясняется наличием/отсутствуем возможности его отлаживать.

Ниже код теста, который надо обязательно выполнять непосредственно из модуля
Н = 1000000;
Массив = Новый Массив();
Массив.Добавить(Ложь);
Массив.Добавить(Ложь);
Для индекс = 2 По Н Цикл
    Массив.Добавить(Истина);
КонецЦикла;

ирОбщий.НачатьЗамерЛкс(, "Замер1");
Для индекс = 2 По Н Цикл      Если Массив[индекс] Тогда          квадрат = индекс * индекс;          Если квадрат <= Н Тогда              м = квадрат;              Пока м <= Н Цикл                  Массив[м] = Ложь;                  м = м + индекс;              КонецЦикла;          КонецЕсли;      КонецЕсли;  КонецЦикла;  
ирОбщий.КончитьЗамерЛкс();

ирОбщий.НачатьЗамерЛкс(, "Замер2");
Для индекс = 2 По Н Цикл
    Если Массив[индекс] Тогда
        квадрат = индекс * индекс;
        Если квадрат <= Н Тогда
            м = квадрат;
            Пока м <= Н Цикл
                Массив[м] = Ложь;
                м = м + индекс;
            КонецЦикла;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;
ирОбщий.КончитьЗамерЛкс();

ирОбщий.НачатьЗамерЛкс(, "Замер3");
Выполнить("Для индекс = 2 По Н Цикл      Если Массив[индекс] Тогда          квадрат = индекс * индекс;          Если квадрат <= Н Тогда              м = квадрат;              Пока м <= Н Цикл                  Массив[м] = Ложь;                  м = м + индекс;              КонецЦикла;          КонецЕсли;      КонецЕсли;  КонецЦикла;
|");  
ирОбщий.КончитьЗамерЛкс();

ирОбщий.НачатьЗамерЛкс(, "Замер4");
Выполнить("Для индекс = 2 По Н Цикл
|    Если Массив[индекс] Тогда
|        квадрат = индекс * индекс;
|        Если квадрат <= Н Тогда
|            м = квадрат;
|            Пока м <= Н Цикл
|                Массив[м] = Ложь;
|                м = м + индекс;
|            КонецЦикла;
|        КонецЕсли;
|    КонецЕсли;
|КонецЦикла;
|");  
ирОбщий.КончитьЗамерЛкс();
Показать
Прикрепленные файлы:
SerVer1C; +1 Ответить
61. Восьмой 87 29.09.22 14:16 Сейчас в теме
а вот такая конструкция как отработает ? :



Выполнить(
"Н = 1000000;
|Массив = Новый Массив();
|Массив.Добавить(Ложь);
|Массив.Добавить(Ложь);
|Для индекс = 2 По Н Цикл
| Массив.Добавить(Истина);
|КонецЦикла;

|ирОбщий.НачатьЗамерЛкс(, "Замер1");
|Для индекс = 2 По Н Цикл Если Массив[индекс] Тогда квадрат = индекс * индекс; Если квадрат <= Н Тогда м = квадрат; |Пока м <= Н Цикл Массив[м] = Ложь; м = м + индекс; КонецЦикла; КонецЕсли; КонецЕсли; КонецЦикла;
|ирОбщий.КончитьЗамерЛкс();

ирОбщий.НачатьЗамерЛкс(, "Замер2");
Для индекс = 2 По Н Цикл
Если Массив[индекс] Тогда
квадрат = индекс * индекс;
Если квадрат <= Н Тогда
м = квадрат;
Пока м <= Н Цикл
Массив[м] = Ложь;
м = м + индекс;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ирОбщий.КончитьЗамерЛкс();

ирОбщий.НачатьЗамерЛкс(, "Замер3");
Выполнить("Для индекс = 2 По Н Цикл Если Массив[индекс] Тогда квадрат = индекс * индекс; Если квадрат <= Н Тогда м = квадрат; Пока м <= Н Цикл Массив[м] = Ложь; м = м + индекс; КонецЦикла; КонецЕсли; КонецЕсли; КонецЦикла;
|");
ирОбщий.КончитьЗамерЛкс();

ирОбщий.НачатьЗамерЛкс(, "Замер4");
Выполнить("Для индекс = 2 По Н Цикл
| Если Массив[индекс] Тогда
| квадрат = индекс * индекс;
| Если квадрат <= Н Тогда
| м = квадрат;
| Пока м <= Н Цикл
| Массив[м] = Ложь;
| м = м + индекс;
| КонецЦикла;
| КонецЕсли;
| КонецЕсли;
|КонецЦикла;
|");
ирОбщий.КончитьЗамерЛкс();[/IS-QUOTE]
64. tormozit 7136 29.09.22 18:42 Сейчас в теме
(61) Странно что ты сумел скопировать этот код и даже модифицировать его, но не сумел выполнить.
65. Восьмой 87 30.09.22 11:59 Сейчас в теме
(64)
Сережа ну ей богу заниматься этой фигней чтобы что-то кому-то доказать? Познавательно - безусловно да, ты как всегда на высоте. Практическое применение? Хм... ну только если конфа с закрытым кодом... а в остальном упаси боже так код писать.
67. tormozit 7136 30.09.22 16:23 Сейчас в теме
Не понял. к чему это. Где именно "фигня"? В предоставленном тобой коде? Если ты не знаешь как выполнить этот код, попроси моей помощи.
68. Восьмой 87 30.09.22 19:35 Сейчас в теме
(67)
Я практической пользы в этом не вижу
69. tormozit 7136 30.09.22 22:09 Сейчас в теме
(68) Зачем тогда писал? Поиздеваться?
70. Восьмой 87 30.09.22 22:35 Сейчас в теме
(69)
Сереж прости ради бога, не думал обидеть)
Просто применение практики однострочного кода в 1С экономически не выгодно из-за сложности отладки
Особенно на типовых конфигурациях, особенно на очень больших и сложных внедрениях.
А причину всего этого можно просто регулировать режимом отладки - если я все правильно понял.
Зачем усложнять себе код?
Зачем добавлять дополнительную обсфукацию осознано в предметно-ориентированной открытой среде разработки где главной идеологией являет максимально читаемый и понятный код даже для разработчиков не участвовавших непосредственно в разработке основной системы?
Или я не прав?

А вот к примеру применение кода вот такого вида
Если Результат=Истина Тогда
....
или конструкции вида
РезультатЗапроса = Запрос.Выполнить();
ВыборкаЗапроса = РезультатЗапроса.Выбрать();

Это не оптимальный код, но он экономически выгоден благодаря своей отказоустойчивости, контекстом локальных переменных,простоте восприятия информации, удобство работы в отладчике - и наверное самое главное - я могу очень хорошо заработать оптимизируя такой код у заказчика, если потребуется в плоть до строки вида:
Если С и Не А Или Z Тогда возврат Б.Выполнить().Выбрать() КонецЕсли;


Я к тому это веду, что любой код в 1С оптимален не всегда благодаря оптимизации быстродействия работы платформы или особенностями использования синтаксиса кода.
60. Восьмой 87 29.09.22 12:42 Сейчас в теме
Сергей привет, нужна консультация эксперта.
Почему конструкция вида:

Если РезультатБулево Тогда
............

работает быстрее чем проверка вида

Если РезультатБулево = Истина Тогда
..................



?
62. oleg-x 26 29.09.22 17:20 Сейчас в теме
(60) Пока ждем ответ эксперта. Есть теория. Что в первом варианте, проверяется только на тип булево и кроме булево ничего не должно прилетать.
А во втором варианте, РезультатБулево может иметь любой тип данных и ошибки сравнения не будет.
Соответственно, больше проверок и дольше выполнение на уровне платформы.
Восьмой; +1 Ответить
63. tormozit 7136 29.09.22 18:39 Сейчас в теме
(60) Тут все просто. Операция сравнения отсутствует в первом варианте. Поэтому во втором варианте выполняется на одну операцию больше, хоть сравнение и выполняется с константой. Зато второй вариант не требует правильного типа переменной для успешного вычисления условия.
SerVer1C; +1 Ответить
66. Tciban 30.09.22 15:28 Сейчас в теме
Вот. Не удержался вставить свои 5 копеек. Во первых строках хочется поблагодарить автора за детальное исследование.
Во вторых возникла следующая мысль -
В некоторых (и даже многих) случаях повторяющийся код, даже повторяющийся в цикле код, можно заменить на процедуру (иногда на функцию) В этом случае все опять же сведется к однострочному коду, но без потери читаемости.
71. Cyberhawk 135 01.10.22 18:16 Сейчас в теме
72. zfilin 2337 17.10.22 12:15 Сейчас в теме
Интересное исследование, ничего не имею против однострочного кода, если он необходим, но методика с дублированием кода - бомба замедленного действия.

Во-первых дублирование кода это уже плохо,

во-вторых если каким-то образом однострочник будет отформатирован (линтером или юным программистом, не знакомым с методикой), то все преимущества потеряются, зато будет два одинаковых куска кода под условием, которые при чтении поставят в тупик кого угодно (о этот вечный вопрос "зачем???"),

и в третьих если кто-то в процессе жизни внесет изменения в один кусок кода, а другой не поправит - это будет очень печально.
А я, прям вижу, как в спешке в форматированном блоке изменения вносят (не исправлять же однострочник, бо он плохочитаемый, а у нас спешка), оставляют _РежимОтладки = Истина, а через некоторое время просматривая код, другой разработчик думает - о, тут по методике режим отладки обратно не вернули, а верну-ка я обратно в Ложь. И привет, старый баг.

Я думаю, что такие вещи должны решаться на уровне платформы какими-нибудь директивами препроцессора, типа #Отладка Выключить / #Отладка Включить. На уровне кода 1С бороться с этим - идея, имеющая нехорошие последствия.
Впрочем, в платформе мы этого не дождемся никогда, по очевидным причинам. Ответ будет: в проде вам отладка не нужна, а на тестах какая разница на те миллисекунды.
NiGMa; Восьмой; +2 Ответить
73. zfilin 2337 17.10.22 12:23 Сейчас в теме
(72) и поворчать вдогонку. Если бы я хотел программировать на языке в котором форматирование кода определяет логику (или производительность) программы, я бы уже писал на питоне. Так что разное поведение кода при разном форматировании это ваша проблема (к разработчикам платформы), а не моя.
=)
Восьмой; +1 Ответить
74. tormozit 7136 17.10.22 19:26 Сейчас в теме
(72)
Формально это конечно дублирование кода. Но фактически отладка и правка кода вручную выполняется только в многострочном варианте. Однострочный вариант можно лишь забыть обновить, но тут уж от тренировки зависит. Я очень редко забываю это делать.

Если есть сомнения в синхронности вариантов кода, то можно легко обновить многострочный вариант (занимает 10 секунд).

Инструкции препроцессора не позволяет переключать скорость на ходу. Поэтому я бы предложил скобки режима компиляции, т.е.
&БыстрыйКод.Начало
ф=1;
Ф=1+1;
&БыстрыйКод.Конец

тогда компилятор бы при разрешенной отладке компилировал оба варианта кода. По умолчанию выполняется однострочный вариант и все точки останова в этом блоке трактуются как точка останова на его первой строке. А когда включаем на ходу особую галку "Отладка быстрого кода", то будет выполнять многострочный код.
Восьмой; zfilin; +2 Ответить
76. Восьмой 87 12.01.23 03:29 Сейчас в теме
(74)
Сереж просвети пожалуйста - "Что такое скобки режима компиляции?"
Такой код разве работает в 1С ????:
&НаСервере
Процедура ПолучитьКонтрагента()
	
КонецПроцедуры

&НаСервере
Процедура ПолучитьДоговор()
	
КонецПроцедуры


&НаСервере
Процедура ТестНаСервере()
//----------	
	&БыстрыйКод.Начало
	Контрагент = ПолучитьКонтрагента();
	Договор = ПолучитьДоговор();
	&БыстрыйКод.Конец
//----------	
КонецПроцедуры

&НаКлиенте
Процедура Тест(Команда)
	ТестНаСервере();
КонецПроцедуры
//-------------------------------------------
Показать
77. Восьмой 87 12.01.23 03:32 Сейчас в теме
А вот такой код будет работать, и я вот одного не понимаю - почему я до сих пор не могу использовать параметры сеанса булевого типа для управления компиляцией кода и его бизнес логикой ?????



&НаСервере
Функция ПолучитьКонтрагента()
	
	Возврат Неопределено
КонецФункции

&НаСервере
Функция ПолучитьДоговор()
	
	Возврат Неопределено
КонецФункции

&НаСервере
Процедура ТестНаСервере()
	//----------	
	#Если НЕ Версия_МоделиБизнесПроцесса_0001 Тогда
		#ЕСЛИ НЕ БЫСТРЫЙ_КОД ТОГДА
			Контрагент = ПолучитьКонтрагента();
		#ИНАЧЕЕСЛИ БЫСТРЫЙ_КОД ТОГДА
			Договор = ПолучитьДоговор();
		#КОНЕЦЕСЛИ     
	#ИначеЕсли Версия_МоделиБизнесПроцесса_0001 Тогда
		Контрагент = ПолучитьКонтрагента();
		Договор = ПолучитьДоговор();
	#ИначеЕсли Версия_МоделиБизнесПроцесса_0002  Тогда
		Ф = 1;
	#Иначе
		Б = 1;
	#КонецЕсли   
	
КонецПроцедуры

&НаКлиенте
Процедура Тест(Команда)
	ТестНаСервере();
КонецПроцедуры

Показать
75. kser87 2438 28.10.22 12:17 Сейчас в теме
Интересно и познавательно, конечно. Но практическое применение тяжело придумать.
78. Dach 372 09.11.23 16:46 Сейчас в теме
Тоже провел тесты. Однострочный код при запуске в файловой базе, без отладки - все-таки немного, но быстрее.
Что при запуске в консоли кода, что при непосредственно в обработках

Отличие обработок

Однострочный код

Многострочный код
Прикрепленные файлы:
ВнешняяОбработка1.epf
ВнешняяОбработка2.epf
Оставьте свое сообщение