ТипЗнч vs Метаданные()


Сравнение скорости определения типа объекта через ТипЗнч и через Метаданные

Периодически приходится делать ветвление в модуле в зависимости от  типа переданного объекта. С учетом возможности получения объекта как объектом так и ссылкой это вырастает в некрасивые

Если ТипЗнч(Основание) = Тип("ДокументСсылка.Документ1")
или ТипЗнч(Основание) = Тип("ДокументОбъект.Документ1") Тогда

В поисках красивого кода и оптимизации решил замерить, что лучше — ТипЗнч или Метаданные — ведь для метаданных сравнений меньше — метаданные одинаковы как у ссылки, так и у объекта.

 

Простой модуль (лентяи могут скачать обработку):

Процедура КнопкаВыполнитьНажатие(Кнопка)
//массив имен справочников
МасМД = Новый Массив;
Для Каждого мдСпр из Метаданные.Справочники Цикл
МасМД.Добавить(мдСпр.Имя)
КонецЦикла;

// проверочный объект и его трансформации
Объект = Справочники[МасМД[0]].ПустаяСсылка();
МД = Объект.Метаданные();
ТипОб = ТипЗнч(Объект);

// цикл по метаданным
Сообщить(ТекущаяДата()+" 1");
Для Каждого мдСпр из МасМД Цикл
Если МД = Метаданные.Справочники[мдСпр] Тогда
а = "Да"
Иначе
а = "Нет"
КонецЕсли;
КонецЦикла;
Сообщить(ТекущаяДата()+" 2");

// цикл по типам
Сообщить(ТекущаяДата()+" 3");
Для Каждого мдСпр из МасМД Цикл
Если ТипОб = Тип("СправочникОбъект."+мдСпр) или ТипОб = Тип("СправочникСсылка."+мдСпр) Тогда
а = "Да"
Иначе
а = "Нет"
КонецЕсли;
КонецЦикла;
Сообщить(ТекущаяДата()+" 4");

КонецПроцедуры

В результате получилось что получение метаданных медленее на порядок-два. И хотя речь о долях секунд, но всё равно увы…
Проверял на 8.1 и на 8.2

24 Comments

  1. Поручик

    (0) Этот факт давно известен. Особенно тормозит метод Метаданные.НайтиПоПолномуИмени или что-то вроде того.

    Reply
  2. ChiginAV

    (0) А всего-то стоило прочитать стандарты разработки на ИТС. Там об этом написано

    Reply
  3. TrinitronOTV

    всё равно спасибо автору за данный материал, изложенный в статье

    Reply
  4. DitriX

    Что то я не понял — а что вам мешает вместо:

    Если ТипЗнч(Основание) = Тип(«ДокументСсылка.Документ1»)
    или ТипЗнч(Основание) = Тип(«ДокументОбъект.Документ1») Тогда

    Написать

    Если ТипЗнч(Основание.Ссылка) = Тип(«ДокументСсылка.Документ1») Тогда
    Reply
  5. w-divin

    (4) DitriX,

    можно добавить в замер и такой вариант и посмотреть результат. Почему-то уверен, что двойной вызов «типзнч(основание)» отработает быстрее )))

    Reply
  6. taiba

    (2) ChiginAV, написано, но не обосновано. А теперь есть и замеры

    Reply
  7. taiba

    (1) Поручик, попробовал здесь найти — не нашел, потому и выложил.

    Reply
  8. taiba

    (5) w-divin, а вот нет. см (8)

    Reply
  9. taiba

    попробовал

    ТипОб = ТипЗнч(Объект); 0,000019

    ТипСС = ТипЗнч(Объект.Ссылка); 0,000046

    но

    Если ТипОб = Тип(«СправочникОбъект.»+мдСпр) или ТипОб = Тип(«СправочникСсылка.»+мдСпр) Тогда 327 0,004849

    Если ТипСС = Тип(«СправочникСсылка.»+мдСпр) Тогда 327 0,003510

    Reply
  10. DrAku1a

    Кроме прочего, ТипЗнч удачно отработает и в случае, когда проверяемая переменная имеет простой тип (строка, число, булево, дата, null, неопределено) или коллекцию.

    В этой ситуации попытка обратиться к свойствам (.Ссылка) или к методам (.Метаданные()) — вызовет ошибку во время выполнения.

    Reply
  11. taiba

    (10) DrAku1a, да, тут вы совершенно правы, но всё зависит от базы и конкретной задачи. Например ветвление по типу основания в ОбработкеЗаполнения не предполагает в качестве основания нессылочные типы.

    Reply
  12. DrAku1a

    (11) Хороший пример… Когда в форме списка документов установлен отбор и создается новый документ, то в качестве источника для заполнения передается Структура.

    Reply
  13. taiba

    (12) DrAku1a, или речь не о 8.1, или я чего-то не отловил. Проверил — ОбработкаЗаполнения не вызывается, в форме ПараметрОбъектКопирования и ПараметрОснование имеют значение Неопределено.

    Reply
  14. DrAku1a

    (13) Хм… Может я туплю… У меня 8.2, конфа Комплексная автоматизация 1.1

    Reply
  15. Артано

    (13)(14) Передача структуры в качестве параметра при созданию документа есть распространенный прием, поэтому не стоит его сбрасывать со счетов. Назначение метаданных несколько другое, автор в своей статье наглядно доказал, что нестандартное использование этого инструмента неоправдано.

    Reply
  16. w-divin

    (9)

    почему нет? как раз по (8)

    ТипЗнч(Объект.Ссылка)

    отрабатывает дольше. причем более чем в 2 раза.

    А если еще каждый раз не получать типзнч то можно и на этом немного поэкономить…

    Reply
  17. taiba

    (16) w-divin, это в относительных величинах, однако в абсолютных сложив 2 шага — 1)получение типа и 2) сравнение типов получим выигрыш 0,001312 при использовании приведения к ссылке. Собственно я и экономлю на получении типзнч, загоняя в переменную.

    Reply
  18. echo77

    (2) ChiginAV, Ссылку на статью можно?

    Reply
  19. ChiginAV
  20. CaSH_2004

    Лично я не сильно доверяю этим сравнениям тьфу, замерам, т.к. как-то понадобилось оптимизировать мне некий код, я его вынес в 2 функции и начал сравнивать их отладчиком — с десяток раз сравнивал и в результате сколько сравнений столько и результатов, иногда на порядок отличались, иногла рядом стояли. Я так и не понял оптимизировал ли я что-то в итоге. Начал равнятся на медленные машины и внутреннее чувство времени. Хотя может это было связано с тем что код работал с формой списка при ее прокрутке, но я прокручивал список равное количество раз для каждого теста.

    Reply
  21. 28z

    (20) CaSH_2004, , но я прокручивал список равное количество раз для каждого теста.

    равное количество раз в секунду?

    Reply
  22. sss999

    НастройкаПрограммы

    (4) расшифруйте что за код?Основание.Ссылка

    Reply
  23. taiba

    (22) в «цикле по типам» идет проверка условия

    Если ТипОб = Тип(«СправочникОбъект.»+мдСпр) или ТипОб = Тип(«СправочникСсылка.»+мдСпр) Тогда

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

    Если ТипОб = Тип(«СправочникСсылка.»+мдСпр) Тогда

    Замеры в таком варианте я приводил в (8)

    Reply
  24. sss999

    (23)я чет затупил ) Я вот разрабатываю объектную модель для 1с, один справочник используется для данных и закрывается для чтения, второй справочник содержит методы доступа к первому справочнику которые работают в привилегированном режиме, хочу сделать полную объектную модель для 1с, типа обертки для разработки со всеми 4-5 пунктами объектов, полиморфизм,наследование,инкапсуляцию.

    Что скажите?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *