Базовые приемы оптимизации кода. Часть №1.

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

Дисклеймер. Всегда важно понимать, что за задача стоит перед программистом. Порой важнее сделать задачу быстрее, чем качественнее. А если заказчик – это микропредприятие, то они вероятно даже не заметят отличия в работе оптимального кода от неоптимального.

Правило №1. Старайтесь не получать значения реквизитов через точку.

Плохо:

Хорошо:

При обращении к ссылке через точку, выполняется неявный запрос к базе данных, который получает все реквизиты и табличные части и временно помещает полученные значения в кэш СУБД. А методы БСП модуля ОбщегоНазначения. ЗначенияРеквизитовОбъекта(), . ЗначениеРеквизитаОбъекта(), .ЗначенияРеквизитовОбъектов(), . ЗначениеРеквизитаОбъектов() помогают получить данных только конкретных реквизитов объекта, тем самым уменьшая нагрузку на СУБД.

Для того, чтобы посмотреть на это более наглядно, проведем эксперимент с замером по методике APDEX

Дополнительно, после каждого замера будем менять номенклатуру случайным образом. Произведем замер по методике APDEX и…. не сказать, что разница сколько-нибудь существенная…

Но не будем торопиться с выводами, в правиле №2 я докажу, что пользоваться функциями БСП намного лучше.

Правило №2. Если нужно получить сразу много значений, то получай их одним запросом.

Рассмотрим случай, когда нам нужно вывести наименования по всему справочнику номенклатура. И сделаем это тремя способами:

  1. Через точку по ссылке,
  2. Через значение реквизита объекта,
  3. Получение одним запросом.

Но здесь нужно быть очень аккуратным с замерами, чтобы не попасть в заблуждение о том, что обращение через точку может быть быстрее. Начнем с того, что стоит дождаться очистки кэша СУБД, чтобы СУБД производила физическое, а не логическое считывание данных.

Так как при быстром нажатие кнопки для инициирования алгоритма и замера времени выполнения, приведет к тому, что данные произойдет логическое считывание данных, временно помещенной таблицы в оперативную память. Поэтому между нажатиями делаем паузу в 10-15 секунд.

Вот кстати интересная выдержка из официальной документации к MS SQL

The I/O from an instance of the SQL Server Database Engine includes logical and physical reads. A logical read occurs every time the Database Engine requests a page from the buffer cache. If the page is not currently in the buffer cache, a physical read first copies the page from disk into the cache.

То есть, мы делаем вывод, что MS SQL копирует страницу (часть или всю таблицу) в оперативную память и до тех пор, пока считает данные в оперативной памяти валидными, считывает их из оперативной памяти.

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

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

chevron_left
chevron_right