gifts2017

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

Опубликовал Виктор Клевцов (taiba) в раздел Программирование - Практика программирования

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

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

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

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

 

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

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

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

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

Наименование Файл Версия Размер
Обработка в зипе 7
.zip 3,22Kb
14.06.13
7
.zip 3,22Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Сергей Ожерельев (Поручик) 15.06.13 14:22
(0) Этот факт давно известен. Особенно тормозит метод Метаданные.НайтиПоПолномуИмени или что-то вроде того.
2. Антон Чигин (ChiginAV) 15.06.13 15:00
(0) А всего-то стоило прочитать стандарты разработки на ИТС. Там об этом написано
3. Александр Лыткин (TrinitronOTV) 15.06.13 17:49
всё равно спасибо автору за данный материал, изложенный в статье
4. Дмитрий Шерстобитов (DitriX) 16.06.13 13:24
Что то я не понял - а что вам мешает вместо:
Если ТипЗнч(Основание) = Тип("ДокументСсылка.Документ1")
или ТипЗнч(Основание) = Тип("ДокументОбъект.Документ1") Тогда


Написать
Если ТипЗнч(Основание.Ссылка) = Тип("ДокументСсылка.Документ1") Тогда
echo77; taiba; +2 Ответить 1
5. Дмитрий Елисеев (w-divin) 17.06.13 10:10
(4) DitriX,
можно добавить в замер и такой вариант и посмотреть результат. Почему-то уверен, что двойной вызов "типзнч(основание)" отработает быстрее )))
6. Виктор Клевцов (taiba) 17.06.13 10:36
(2) ChiginAV, написано, но не обосновано. А теперь есть и замеры
7. Виктор Клевцов (taiba) 17.06.13 10:41
(1) Поручик, попробовал здесь найти - не нашел, потому и выложил.
8. Виктор Клевцов (taiba) 17.06.13 10:52
попробовал
ТипОб = ТипЗнч(Объект); 0,000019
ТипСС = ТипЗнч(Объект.Ссылка); 0,000046

но
Если ТипОб = Тип("СправочникОбъект."+мдСпр) или ТипОб = Тип("СправочникСсылка."+мдСпр) Тогда 327 0,004849
Если ТипСС = Тип("СправочникСсылка."+мдСпр) Тогда 327 0,003510
9. Виктор Клевцов (taiba) 17.06.13 10:52
10. Андрей Акулов (DrAku1a) 19.06.13 02:14
Кроме прочего, ТипЗнч удачно отработает и в случае, когда проверяемая переменная имеет простой тип (строка, число, булево, дата, null, неопределено) или коллекцию.
В этой ситуации попытка обратиться к свойствам (.Ссылка) или к методам (.Метаданные()) - вызовет ошибку во время выполнения.
veiuper; taiba; shmellevich; +3 Ответить 1
11. Виктор Клевцов (taiba) 19.06.13 11:45
(10) DrAku1a, да, тут вы совершенно правы, но всё зависит от базы и конкретной задачи. Например ветвление по типу основания в ОбработкеЗаполнения не предполагает в качестве основания нессылочные типы.
12. Андрей Акулов (DrAku1a) 19.06.13 14:14
(11) Хороший пример... Когда в форме списка документов установлен отбор и создается новый документ, то в качестве источника для заполнения передается Структура.
Артано; +1 Ответить 1
13. Виктор Клевцов (taiba) 19.06.13 14:50
(12) DrAku1a, или речь не о 8.1, или я чего-то не отловил. Проверил - ОбработкаЗаполнения не вызывается, в форме ПараметрОбъектКопирования и ПараметрОснование имеют значение Неопределено.
14. Андрей Акулов (DrAku1a) 19.06.13 15:03
(13) Хм... Может я туплю... У меня 8.2, конфа Комплексная автоматизация 1.1
15. Артано Майаров (Артано) 20.06.13 04:16
(13)(14) Передача структуры в качестве параметра при созданию документа есть распространенный прием, поэтому не стоит его сбрасывать со счетов. Назначение метаданных несколько другое, автор в своей статье наглядно доказал, что нестандартное использование этого инструмента неоправдано.
16. Дмитрий Елисеев (w-divin) 20.06.13 08:32
(9) taiba,
почему нет? как раз по (8)
ТипЗнч(Объект.Ссылка)
отрабатывает дольше. причем более чем в 2 раза.
А если еще каждый раз не получать типзнч то можно и на этом немного поэкономить...
17. Виктор Клевцов (taiba) 20.06.13 14:42
(16) w-divin, это в относительных величинах, однако в абсолютных сложив 2 шага - 1)получение типа и 2) сравнение типов получим выигрыш 0,001312 при использовании приведения к ссылке. Собственно я и экономлю на получении типзнч, загоняя в переменную.
18. Александр Крынецкий (echo77) 21.06.13 07:12
(2) ChiginAV, Ссылку на статью можно?
20. Олег Шалимов (CaSH_2004) 23.06.13 18:23
Лично я не сильно доверяю этим сравнениям тьфу, замерам, т.к. как-то понадобилось оптимизировать мне некий код, я его вынес в 2 функции и начал сравнивать их отладчиком - с десяток раз сравнивал и в результате сколько сравнений столько и результатов, иногда на порядок отличались, иногла рядом стояли. Я так и не понял оптимизировал ли я что-то в итоге. Начал равнятся на медленные машины и внутреннее чувство времени. Хотя может это было связано с тем что код работал с формой списка при ее прокрутке, но я прокручивал список равное количество раз для каждого теста.
21. Андрейка (28z) 31.10.14 15:15
(20) CaSH_2004, , но я прокручивал список равное количество раз для каждого теста.
равное количество раз в секунду?