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

Опубликовал Алексей Лустин (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
56
.1187960300 30,00Kb 56 Бесплатно

См. также

Добавить вознаграждение
Комментарии
1. Доржи Цыденов (support) 4378 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) 3651 28.08.07 08:31 Сейчас в теме
>P.S. как обычно хотелось бы предупредить что я считаю что 1cpp.dll уже загружена у вас в глобальном модуле
А тормоза от загруженности 1cpp.dll не пробовал проверить ;)
5. Евгений Мартыненков (JohnyDeath) 291 28.08.07 10:57 Сейчас в теме
Аркадий, и какие, если не секрет, тормоза от загрузки 1с++?
6. Аркадий Кучер (Abadonna) 3651 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) 3651 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) 6072 28.10.08 18:08 Сейчас в теме
Мне очень нравится оптимизация...
Поменял блоки замеров местами - получил результат с точностью, да наоборот...
Изменил порядок инициализации. Попробовал, особой разницы нет.
Правда предложенный метод, в отличии от стандартного, не находит "пустые значения" в строках...
Может я делаю что-то не так?

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

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


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


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