PORTA.ru - on-line магазин ПОРТАтивной техники.PORTA.ru - on-line магазин ПОРТАтивной техники.

Новости
Мои разработки
FAQ
Ссылки
Форум

Варианты оптимизации (уменьшение времени выполнения)

В одной конфе, при анализе производительности кода выяснилось, что львинная доля времени уходит на строку:
ТЗ=СоздатьОбъект("ТаблицаЗначений");
Небольшое изменение позволило в два раза ускорить этот участок:

Перем ПустаяТаблицаЗначений;
//_____________________________________________________________________________
Функция СоздатьТЗ_Способ1()
Возврат СоздатьОбъект("ТаблицаЗначений");
КонецФункции
//_____________________________________________________________________________
Функция СоздатьТЗ_Способ2()
Возврат ЗначениеИзСтроки(ПустаяТаблицаЗначений);
КонецФункции
//_____________________________________________________________________________
Процедура Сформировать()
КолВоЗамеров=100000;
Старт=_GetPerformanceCounter();
Для нз=1 по КолВоЗамеров Цикл
ТЗ=СоздатьТЗ_Способ1();
КонецЦикла;
Сообщить("Способ 1:"+(_GetPerformanceCounter()-Старт)+" ед.вр.");
Старт=_GetPerformanceCounter();
Для нз=1 по КолВоЗамеров Цикл
ТЗ=СоздатьТЗ_Способ2();
КонецЦикла;
Сообщить("Способ 2:"+(_GetPerformanceCounter()-Старт)+" ед.вр.");
КонецПроцедуры
ПустаяТаблицаЗначений=ЗначениеВСтроку(СоздатьОбъект("ТаблицаЗначений"));
//_____________________________________________________________________________
у меня выдало:
Способ 1:15610 ед.вр.
Способ 2: 6622 ед.вр.

Использование виртуального диска
Например: The AR RAM Disk is a freeware driver for Windows NT, Windows 2000 and Windows XP
Для сравнения, перепроведем порядка 40 документов по реализации в ПУБ на локальной базе в разделенном режиме с одним пользователем:
Произведем по два замера (для усреднения результатов) с использованием вирт. диска Z:\ и без него:
С размещением временных на вирт.диске, размером 40 Гб:
(командная строка: D:\1c\BIN\1cv7.exe /TZ:\)
1-й замер: 69 сек
2-й замер: 66 сек
Стандарт.режим (без вирт.диска):
(командная строка: D:\1c\BIN\1cv7.exe)
1-й замер: 129 сек
2-й замер: 132 сек

В модулях проведения многих доков используется конструкция типа:
Если СписокТМЦ.Принадлежит(ТМЦ) = 0 Тогда
СписокТМЦ.ДобавитьЗначение(ТМЦ);
КонецЕсли;
выполняется это для каждой строки документа.
Как описано в документации, метод Принадлежит() "оптимизирует проверку принадлежности при массовых последовательных сравнениях, если между
сравнениями сам список не меняется". А в данном случае СписокТМЦ меняется почти при каждом проходе цикла. Поэтому и использовать Принадлежит() нет смысла.
Если заменить все выражения вида:
НекийСписокЗначений.Принадлежит(НекийЭлемент) = 0
на
НекийСписокЗначений.НайтиЗначение(НекийЭлемент) = 0
то документ в этом случае проводится в 1.5 - 3 раза быстрее, в зав-ти от размера табл. части.
<сообщил Foxx>

В этих же документах сначала делается запрос к бухитогам с фильтрами по субконто по спискам значений, а затем для каждой строки табл. части делается выборка из запроса.
Из долгих экспериментов выведено, что процесс можно ускорить до 10 (!!!) раз, если не делать общий запрос и потом выборку, а делать несколько отдельных запросов по конкретным значениям субконто, и брать итоговые суммы из запроса. Особенно актуально для документов с маленьким кол-вом строк в табл. части. При увеличении к-ва строк "разрыв" между двумя способами сокращается и начиная с 50-100 строк в табл. части (в зав-ти от объема базы) сравнивается. Затем более оптимально пользоваться "старой" схемой.
<сообщил Foxx>

- Наверх -

В качестве благодарности за решение проблемы, щелкните здесь.
Поддержите развитие сайта.
Спасибо!
Автор и разработчик: Кайгородов Андрей aka mszsuz. mszsuz@online.sinor.ru ICQ#33993114. Дата последнего обновления страницы: Friday 09.04.2004 16:52
1C:TOP-100 Рейтинг ресурсов 1С
Hosted by uCoz