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

15.06.13

Разработка - Механизмы платформы 1С

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Обработка в зипе
.zip 3,22Kb
7
7 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

 

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

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

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

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    7459    bayselonarrend    20    

154

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    5947    dsdred    16    

80

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    17674    YA_418728146    26    

71

Перенос данных 1C Механизмы платформы 1С Системный администратор Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    11227    dsdred    44    

130

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    23763    SeiOkami    48    

135

Механизмы платформы 1С Системный администратор Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    18835    human_new    27    

80

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14735    YA_418728146    7    

166
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Поручик 4692 15.06.13 14:22 Сейчас в теме
(0) Этот факт давно известен. Особенно тормозит метод Метаданные.НайтиПоПолномуИмени или что-то вроде того.
7. taiba 87 17.06.13 10:41 Сейчас в теме
(1) Поручик, попробовал здесь найти - не нашел, потому и выложил.
2. ChiginAV 15.06.13 15:00 Сейчас в теме
(0) А всего-то стоило прочитать стандарты разработки на ИТС. Там об этом написано
6. taiba 87 17.06.13 10:36 Сейчас в теме
(2) ChiginAV, написано, но не обосновано. А теперь есть и замеры
18. echo77 1906 21.06.13 07:12 Сейчас в теме
(2) ChiginAV, Ссылку на статью можно?
3. TrinitronOTV 16 15.06.13 17:49 Сейчас в теме
всё равно спасибо автору за данный материал, изложенный в статье
4. DitriX 2101 16.06.13 13:24 Сейчас в теме
Что то я не понял - а что вам мешает вместо:
Если ТипЗнч(Основание) = Тип("ДокументСсылка.Документ1")
или ТипЗнч(Основание) = Тип("ДокументОбъект.Документ1") Тогда


Написать
Если ТипЗнч(Основание.Ссылка) = Тип("ДокументСсылка.Документ1") Тогда
CratosX; echo77; taiba; +3 Ответить
5. w-divin 17.06.13 10:10 Сейчас в теме
(4) DitriX,
можно добавить в замер и такой вариант и посмотреть результат. Почему-то уверен, что двойной вызов "типзнч(основание)" отработает быстрее )))
9. taiba 87 17.06.13 10:52 Сейчас в теме
16. w-divin 20.06.13 08:32 Сейчас в теме
(9)
почему нет? как раз по (8)
ТипЗнч(Объект.Ссылка)
отрабатывает дольше. причем более чем в 2 раза.
А если еще каждый раз не получать типзнч то можно и на этом немного поэкономить...
17. taiba 87 20.06.13 14:42 Сейчас в теме
(16) w-divin, это в относительных величинах, однако в абсолютных сложив 2 шага - 1)получение типа и 2) сравнение типов получим выигрыш 0,001312 при использовании приведения к ссылке. Собственно я и экономлю на получении типзнч, загоняя в переменную.
22. sss999 48 02.09.17 10:29 Сейчас в теме
НастройкаПрограммы
(4) расшифруйте что за код?Основание.Ссылка
23. taiba 87 05.09.17 16:06 Сейчас в теме
(22) в "цикле по типам" идет проверка условия
Если ТипОб = Тип("СправочникОбъект."+мдСпр) или ТипОб = Тип("СправочникСсылка."+мдСпр) Тогда
т.е. анализируемый объект может быть как полным (СправочникОбъект), так и ссылкой (СправочникСсылка). Поскольку в примере нужно лишь определить тип метаданных, то неважно, какого типа объект анализируем. Поэтому, для упрощения кода можно сделать типизацию и гарантированно получить объект типа СправочникСсылка и проверять лишь одно условие
Если ТипОб = Тип("СправочникСсылка."+мдСпр) Тогда


Замеры в таком варианте я приводил в (8)
24. sss999 48 06.09.17 17:31 Сейчас в теме
(23)я чет затупил ) Я вот разрабатываю объектную модель для 1с, один справочник используется для данных и закрывается для чтения, второй справочник содержит методы доступа к первому справочнику которые работают в привилегированном режиме, хочу сделать полную объектную модель для 1с, типа обертки для разработки со всеми 4-5 пунктами объектов, полиморфизм,наследование,инкапсуляцию.
Что скажите?
8. taiba 87 17.06.13 10:52 Сейчас в теме
попробовал
ТипОб = ТипЗнч(Объект); 0,000019
ТипСС = ТипЗнч(Объект.Ссылка); 0,000046

но
Если ТипОб = Тип("СправочникОбъект."+мдСпр) или ТипОб = Тип("СправочникСсылка."+мдСпр) Тогда 327 0,004849
Если ТипСС = Тип("СправочникСсылка."+мдСпр) Тогда 327 0,003510
10. DrAku1a 1745 19.06.13 02:14 Сейчас в теме
Кроме прочего, ТипЗнч удачно отработает и в случае, когда проверяемая переменная имеет простой тип (строка, число, булево, дата, null, неопределено) или коллекцию.
В этой ситуации попытка обратиться к свойствам (.Ссылка) или к методам (.Метаданные()) - вызовет ошибку во время выполнения.
veiuper; taiba; shmellevich; +3 Ответить
11. taiba 87 19.06.13 11:45 Сейчас в теме
(10) DrAku1a, да, тут вы совершенно правы, но всё зависит от базы и конкретной задачи. Например ветвление по типу основания в ОбработкеЗаполнения не предполагает в качестве основания нессылочные типы.
12. DrAku1a 1745 19.06.13 14:14 Сейчас в теме
(11) Хороший пример... Когда в форме списка документов установлен отбор и создается новый документ, то в качестве источника для заполнения передается Структура.
Артано; +1 Ответить
13. taiba 87 19.06.13 14:50 Сейчас в теме
(12) DrAku1a, или речь не о 8.1, или я чего-то не отловил. Проверил - ОбработкаЗаполнения не вызывается, в форме ПараметрОбъектКопирования и ПараметрОснование имеют значение Неопределено.
14. DrAku1a 1745 19.06.13 15:03 Сейчас в теме
(13) Хм... Может я туплю... У меня 8.2, конфа Комплексная автоматизация 1.1
15. Артано 795 20.06.13 04:16 Сейчас в теме
(13)(14) Передача структуры в качестве параметра при созданию документа есть распространенный прием, поэтому не стоит его сбрасывать со счетов. Назначение метаданных несколько другое, автор в своей статье наглядно доказал, что нестандартное использование этого инструмента неоправдано.
20. CaSH_2004 373 23.06.13 18:23 Сейчас в теме
Лично я не сильно доверяю этим сравнениям тьфу, замерам, т.к. как-то понадобилось оптимизировать мне некий код, я его вынес в 2 функции и начал сравнивать их отладчиком - с десяток раз сравнивал и в результате сколько сравнений столько и результатов, иногда на порядок отличались, иногла рядом стояли. Я так и не понял оптимизировал ли я что-то в итоге. Начал равнятся на медленные машины и внутреннее чувство времени. Хотя может это было связано с тем что код работал с формой списка при ее прокрутке, но я прокручивал список равное количество раз для каждого теста.
21. 28z 31.10.14 15:15 Сейчас в теме
(20) CaSH_2004, , но я прокручивал список равное количество раз для каждого теста.
равное количество раз в секунду?
25. dlebedev8 10.03.23 16:00 Сейчас в теме
&НаСервере
Процедура КнопкаВыполнитьНажатие()
	
	ТестовыеДанные = Новый Соответствие;
	Для Каждого Справочник из Метаданные.Справочники Цикл
		ТестовыеДанные.Вставить(Справочник.Имя, Справочники[Справочник.Имя].ПустаяСсылка());
	КонецЦикла;
	
	// цикл по метаданным
	НачалоТеста = ТекущаяУниверсальнаяДатаВМиллисекундах();
	Сообщить("Начало теста Метаданные: " + НачалоТеста);
	Для Каждого Справочник из ТестовыеДанные Цикл
		Результат = Справочник.Значение.Метаданные().Имя = Справочник.Ключ;
	КонецЦикла;
	ОкончаниеТеста = ТекущаяУниверсальнаяДатаВМиллисекундах();
	Сообщить("Окончание теста Метаданные: " + ОкончаниеТеста);
	Длительность = ОкончаниеТеста - НачалоТеста;
	
	// Длительность: 5
	Сообщить("Длительность: " + Длительность);
	
	// цикл по типам
	НачалоТеста = ТекущаяУниверсальнаяДатаВМиллисекундах();
	Сообщить("Начало теста ТипЗнч: " + НачалоТеста);
	Для Каждого Справочник из ТестовыеДанные Цикл
		Результат = ТипЗнч(Справочник.Значение) = Тип("СправочникСсылка." + Справочник.Ключ);
	КонецЦикла;
	ОкончаниеТеста = ТекущаяУниверсальнаяДатаВМиллисекундах();
	Сообщить("Окончание теста ТипЗнч: " + ОкончаниеТеста);
	Длительность = ОкончаниеТеста - НачалоТеста;
	// Длительность: 6
	Сообщить("Длительность: " + Длительность);
	
КонецПроцедуры
Показать


Вот вам результаты замеров чуть с другим подходом из 2023 года

P.S. Запускал много раз, результаты различаются, но в среднем все равно первый цикл отрабатывает на 1 миллисекунду быстрее, чем второй. Но это настолько мало, что можно считать, что оба метода можно использовать, не задумываясь об их производительности.

P.P.S. Увеличил количество циклов в 1000 раз, чтобы оценить время точнее. В общем, нет разницы, какой из методов использовать. Погрешность измерений больше, чем разница между ними.
user2094475; taiba; +2 Ответить
Оставьте свое сообщение