На PORTA.ru
ОГРОМНЫЙ выбор портативной техники:
MD-плееры CD-плееры MP3-плееры Кассетные плееры Диктофоны Радио Цифр. камеры Сотовые Дешевые ноутбуки |
||
Варианты оптимизации (уменьшение времени выполнения) В одной
конфе, при анализе производительности кода выяснилось, что львинная доля
времени уходит на строку:
ТЗ=СоздатьОбъект("ТаблицаЗначений"); Небольшое изменение позволило в два раза ускорить этот участок: Перем ПустаяТаблицаЗначений; //_____________________________________________________________________________ Функция СоздатьТЗ_Способ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 |