Отправляет email-рассылки с помощью сервиса Sendsay

Школа 1С

  Все выпуски  

1С:Школа : 'Быстрые' и 'медленные' переменные - 2


Информационный Канал Subscribe.Ru

1С:Школа
Выпуск 53
«Быстрые» и «медленные» переменные - 2

Здравствуйте, уважаемые Ученики, Коллеги и Читатели!

В этом выпуске мы продолжим разговор о «быстрых» и «медленных» переменных. Отрадно знать, что среди читателей нашей рассылки так много пытливых умов. Благодаря им, тем, кому информации в прошлом выпуске показалось мало, благодаря их настойчивым просьбам, выраженным посредством электронных писем, «Школа 1С» провела дополнительные, более глубокие исследования рассматриваемого вопроса. И у нас есть, что сказать вам!

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

В первую очередь, конечно, следует рассказать о методике получения результатов.

Техническая сторона дела была подробно описана и в предыдущем выпуске. Но все же позволим себе немного напомнить: работаем с программой «1С:Предприятие 7.7», измеряем время выполнения участков программного модуля, участки имеют одинаковую структуру, в основной смысловой части каждого участка, выполняющейся миллион раз, используются переменные только одного вида, измерения производим с помощью функции Отладчика, которая называется «Замер производительности». В исследовании рассматриваются переменные следующих видов: реквизиты формы; переменные, объявленные на экспорт в Глобальном модуле; переменные, объявленные в текущем модуле; переменные, объявленные в текущей процедуре текущего модуля; необъявленные переменные. Структуру каждого исследуемого участка можно выразить следующим образом:
         а) инициализация переменных;
         б) цикл повторений обменов:
                        i. заголовок цикла;
                        ii. тело цикла:
                                   1. первое присваивание;
                                   2. второе присваивание;
                                   3. третье присваивание;
                        iii. окончание цикла.
Сразу стоит определиться с некоторыми терминами: к смысловой части участка мы относим все то, что входит в пункт (б); пункты (i) и (iii) вместе мы будем называть операторами описания цикла.

Теперь про обработку результатов.

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

Наконец переходим к анализу полученных результатов.

Вначале о рейтинге видов переменных. Как это правильно было замечено нашими наиболее активными Читателями, рейтинг следовало бы несколько уточнить. И действительно, более аккуратные замеры и более тщательный анализ показывают следующее:
            1. дольше всех выполнялся участок программного модуля, в котором все переменные являлись реквизитами формы;
            2. участок, в котором все переменные являются экспортируемыми из Глобального модуля, в среднем выполнялся в 3 с небольшим раза быстрее, чем (1);
            3. участок, в котором все переменные являются необъявленными, в среднем выполнялся в 1,5 с небольшим раза быстрее, чем (2), и в 4,6 раза быстрее, чем (1);
            4. участок с переменными, объявленными в текущем модуле, выполнялся быстрее, чем (3), в среднем на 2%, или почти в 4,7 раза быстрее, чем (1);
            5. участок с переменными, объявленными в текущей процедуре текущего модуля, выполнялся  на 1% быстрее, чем (4), почти на 3% быстрее, чем (3), или почти в 4,75 раза быстрее, чем (1).

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

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

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

Вид переменных

Операторы описания цикла

Операторы тела цикла

Реквизиты формы

71%

29%

Экспортируемые из Глобального модуля

81%

19%

Объявленные в текущем модуле

96%

4%

Объявленные в текущей процедуре текущего модуля

96%

4%

Необъявленные

96%

4%

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

Впрочем, мы ведь уже попробовали оптимизировать – использовали разные виды переменных! Оказалось, что это неодинаково отразилось на времени выполнения операторов описания цикла и операторов тела цикла. Рассмотрим подробнее.

Менее всего ускорились операторы описания цикла. Самыми медленными были операторы описания цикла с реквизитом формы в качестве счетчика. Интересный факт: оператор КонецЦикла выполнялся почти в 4 раза медленнее оператора Для. При использовании в качестве счетчика переменной, экспортируемой из Глобального модуля, выполнение операторов цикла ускорилось в 2,7 раза. Оператор КонецЦикла выполнялся в 1,8 раз медленнее оператора Для. При использовании необъявленной переменной в качестве счетчика цикла произошло ускорение в 3,4 раза относительно реквизитов формы или в 1,27 раза относительно переменных, экспортируемых из Глобального модуля. Использование переменных, объявленных в текущем модуле, дало еще 2% ускорения относительно необъявленных переменных. Еще 1% ускорения дало использование переменных, объявленных в текущей процедуре текущего модуля. В трех последних случаях операторы КонецЦикла выполнялись примерно в 1,2 раза медленнее операторов Для.

Заметнее всего ускорение проявилось на операторах тела цикла. Реквизиты формы традиционно были медленнее всех остальных видов переменных. Использование в теле цикла переменных, экспортируемых из Глобального модуля, дало ускорение в 4,6 раза. Однако вклад разных видов переменных в дальнейшее ускорение происходит в некотором рассогласовании с общим рейтингом. Переменные, объявленные в текущем модуле, при использовании их в теле цикла дали ускорение в 7,26 раз относительно экспортируемых из Глобального модуля и в 33,3 раза относительно реквизитов формы. Еще 1% ускорения дало использование переменных, объявленных в текущей процедуре текущего модуля, и еще 2% добавило использование необъявленных переменных. Таким образом, при использовании необъявленных переменных операторы тела цикла выполнялись в 7,44 раза быстрее, чем при использовании экспортируемых из Глобального модуля переменных, и в 34,2 раза быстрее, чем при использовании реквизитов формы.

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

Но об этом уже в следующих выпусках рассылки!

С уважением, Директор «Школы 1С» Владислав Аврутин.


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.school1c
Отписаться

В избранное