gifts2017

Оптимизация, оптимизация, оптимизация !!! (Проверка пустых значений ТабличныхЧастей)

Опубликовал Алексей Лустин (lustin) в раздел Программирование - Практика программирования

Оптимизация, оптимизация, оптимизация !!!

Использование новых механизмов, для решения старых задач

Не так давно мне встретился сдедующий код в модуле проведения

ВыбратьСтроки();
    Пока ПолучитьСтроку()=1 Цикл
        Если ПустоеЗначение(Товар)=1 Тогда
            Сообщить("В строке "+НомерСтроки+" не выбрана номенклатура!", "i");
            СуществуютНезаполенныеСтроки=1;
        КонецЕсли;
    КонецЦикла;


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

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


Поэтому была предпринята попытка сократить время выполнения выборки

например у Вашего покорного слуги случались документы и с количеством строк 1000

Для тестирования был взят документ простенький - строк 100.

И нарисована обработка для сравнения методов

Результат меня поразил:
Стандартный цикл 0.047 сек.
Методы ИТЗ цикл 0.011 сек.

Таким образом если даже предположить теоритически что в среднем:
в день проводится 200 документов
с количеством строк 100 штук (опять же средне)

Стандартный цикл = 9.4 секунд в день
ИТЗ (1С++) = 2.2 секунды в день

Вообщем если коротко то выйгрыш от использования в 4 раза

Результат для проб выношу для вашего внимание в виде обработки

P.S. как обычно хотелось бы предупредить что я считаю что 1cpp.dll уже загружена у вас в глобальном модуле

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

Наименование Файл Версия Размер Кол. Скачив.
Тесть
.1187960300 30,00Kb
25.09.09
55
.1187960300 30,00Kb 55 Бесплатно

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Доржи Цыденов (support) 24.08.07 19:12
Пожелание, не использовать [code] в тексте краткого описания. А то всю главную страницу испортил. :)
2. desty (lustin) 24.08.07 20:44
виноват, не подумал. Исправился
3. Сhe Burashka (CheBurator) 25.08.07 03:16
4. Аркадий Кучер (Abadonna) 28.08.07 08:31
>P.S. как обычно хотелось бы предупредить что я считаю что 1cpp.dll уже загружена у вас в глобальном модуле
А тормоза от загруженности 1cpp.dll не пробовал проверить ;)
5. Евгений Мартыненков (JohnyDeath) 28.08.07 10:57
Аркадий, и какие, если не секрет, тормоза от загрузки 1с++?
6. Аркадий Кучер (Abadonna) 28.08.07 11:01
Ну глобальная переменная-то висит, раз в глобальнике грузит...
7. desty (lustin) 28.08.07 11:10
Какая такая глобальная переменная?

вообще то насколько я знаю сам факт загрузки 1cpp.dll ускоряет работу 1С только за счет одного только TurboBL
8. desty (lustin) 28.08.07 11:12
то есть в принципе от вас только требуется

ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+"1cpp.dll");

и всё.... Какие тут глобальные переменные ?
9. Аркадий Кучер (Abadonna) 28.08.07 11:18
ну накинулись ;) пошутил я...
10. Lomok (lomok) 28.08.07 12:18
автор у вас температура?
11. desty (lustin) 28.08.07 13:13
>>автор у вас температура?

Да нет, нормально всё...
12. desty (lustin) 23.10.07 23:01
очень интересно за что конкретно минус ? не воспринимаем критику?
13. Алексей Константинов (alexk-is) 28.10.08 18:08
Мне очень нравится оптимизация...
Поменял блоки замеров местами - получил результат с точностью, да наоборот...
Изменил порядок инициализации. Попробовал, особой разницы нет.
Правда предложенный метод, в отличии от стандартного, не находит "пустые значения" в строках...
Может я делаю что-то не так?

Код
//*******************************************
Процедура Сформировать()
   
   Если сзРеквизитовТЧ.ТекущаяСтрока()=0 Тогда
      Возврат;
   КонецЕсли;
   
   ТекущийРеквизит = сзРеквизитовТЧ.ПолучитьЗначение(сзРеквизитовТЧ.ТекущаяСтрока());
      

   Начало = _GetPerformanceCounter();
   ВыбранныйДокумент = СоздатьОбъект("Документ." + ВыбранныйДокументВФорме.Вид());
   ВыбранныйДокумент.НайтиДокумент(ВыбранныйДокументВФорме);
   ИТЗ = СоздатьОбъект("ИндексированнаяТаблица");
   ИмяИндекса = "По"+ТекущийРеквизит;
   ИТЗ.Загрузить(ВыбранныйДокумент,""+ТекущийРеквизит+", НомерСтроки");
   
   ИТЗ.ДобавитьИндекс(ИмяИндекса, ""+ТекущийРеквизит);
   ПустоеЗначениеФильтра = ПолучитьПустоеЗначение();
   Если ИТЗ.КоличествоЗначенийКлюча(ИмяИндекса,ПустоеЗначениеФильтра)=1 Тогда
      ИТЗ.УстановитьФильтр(ПустоеЗначениеФильтра, ПустоеЗначениеФильтра,"ПоТовару");
      ИТЗ.ВыбратьСтроки(ИмяИндекса);
      Пока ИТЗ.ПолучитьСтроку(ИмяИндекса) = 1 Цикл
         Сообщить("ИТЗ В строке "+ИТЗ.НомерСтрокиДокумента+" не выбран "+ТекущийРеквизит, "i");
         СуществуютНезаполенныеСтроки=1;
      КонецЦикла;
   КонецЕсли;
   Конец = _GetPerformanceCounter()-Начало;
   Форма.атрВремяНовогоМетода.Заголовок("Нестандартно: методы ИТЗ  "+Конец+" сек.");
   //Сообщить("Нестандартно цикл "+(Конец/1000)+" сек.");
   
   ВыбранныйДокумент = "";
   
   Начало = _GetPerformanceCounter();
   ВыбранныйДокумент = СоздатьОбъект("Документ." + ВыбранныйДокументВФорме.Вид());
   ВыбранныйДокумент.НайтиДокумент(ВыбранныйДокументВФорме);
    ВыбранныйДокумент.ВыбратьСтроки();
   Пока ВыбранныйДокумент.ПолучитьСтроку()=1 Цикл
      Если ПустоеЗначение(ВыбранныйДокумент.ПолучитьАтрибут(ТекущийРеквизит)) = 1 Тогда
         Сообщить("СМ В строке "+ВыбранныйДокумент.НомерСтроки+" не выбран "+ТекущийРеквизит, "i");
         СуществуютНезаполенныеСтроки=1;
      КонецЕсли;
   КонецЦикла;
   Конец = _GetPerformanceCounter()-Начало;
   //Сообщить("Стандартный цикл "+(Конец/1000)+" сек.");
   Форма.атрВремяСтарогоМетода.Заголовок("Стандартный цикл  "+Конец+" сек.");
   
КонецПроцедуры


Процедура ПриВыбореДокумента()
   Если ПустоеЗначение(ВыбранныйДокументВФорме)=1 Тогда
      Возврат;
   КонецЕсли;
   
   
   Для сч=1 По Метаданные.Документ(ВыбранныйДокументВФорме.Вид()).РеквизитТабличнойЧасти() Цикл
      
      МетаРеквизитТЧ = Метаданные.Документ(ВыбранныйДокументВФорме.Вид()).РеквизитТабличнойЧасти(сч);
      
      сзРеквизитовТЧ.ДобавитьЗначение(МетаРеквизитТЧ.Идентификатор, МетаРеквизитТЧ.Идентификатор);
      
   КонецЦикла;
   
   
КонецПроцедуры   // ПриВыбореДокумента


//*****************************************************************************
Процедура ПриОткрытии() //предопределенная
   
   ЗагрузитьВнешнююКомпоненту("1cpp.dll");
   
   ПриВыбореДокумента();
   
КонецПроцедуры //ПриОткрытии
Показать полностью
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа