Имя: Пароль:
1C
1С v8
Получить объект против ссылки для получения одного реквизита один раз
0 Ndochp
 
25.12.13
16:27
Задумался, насколько медленнее получить объект по сравнению с получить реквизит из ссылки.
Набросал код для проверки. Оказалось, что объект быстрее, причем значительно (при первом пуске, потом ссылки кэшируются на 20 секунд)
То, что ссылка в первый раз не должна быть быстрее объекта это понятно, но почему объект быстрее в три раза?
База файловая, на моей 200 ссылки, 65 - объекты. Или я где-то в коде проверки накосячил?

Процедура КнопкаВыполнитьНажатие(Кнопка)
    Выборка2 = Справочники.СотрудникиОрганизаций.Выбрать();
    Н3 = ТекущаяУниверсальнаяДатаВМиллисекундах();
    Пока Выборка2.Следующий() Цикл
        цй = Выборка2.ПолучитьОбъект();
        цй2 = цй.Наименование;
    КонецЦикла;
    Н4 = ТекущаяУниверсальнаяДатаВМиллисекундах();
    
    Выборка = Справочники.СотрудникиОрганизаций.Выбрать();
    Н1 = ТекущаяУниверсальнаяДатаВМиллисекундах();
    Пока Выборка.Следующий() Цикл
        йц = Выборка.Ссылка;
        йц2 = йц.Наименование;
    КонецЦикла;
    Н2 = ТекущаяУниверсальнаяДатаВМиллисекундах();
    
    
    Сообщить("Ссылки " + (Н2-Н1) + " объекты " + (Н4-Н3));
    
КонецПроцедуры
1 WildSery
 
25.12.13
16:47
Объект получен "целиком", и чтобы прочитать Наименование, на SQL дополнительно не лезет.
2 Maxus43
 
25.12.13
16:49
чтоб получить один реквизит кошернее его Запросом вытаскивать. Но конечо всем лень
3 Defender aka LINN
 
25.12.13
16:52
(0) У тебя ж в выборке и так все реквизиты вытаращены. Замени в первом примере на запрос
4 palpetrovich
 
25.12.13
16:59
ну да,  "йц = Выборка.Ссылка;" - каак-бы лишнее, достаточно йц2 = Выборка.Наименование;
5 Ndochp
 
25.12.13
17:13
(1) так выборка одинаковая, получитьОбъект на скуль лезет, сссылка.Наименование на скуль лезет. Почему же разница в три раза?
(2) У меня исходная задача - при начале работы системы, если реквизит не заполнен, то запускаемся первый раз с этим предопределенным элементом справочника, надо заполнить все реквизиты. Вот и возник вопрос, как правильно, получать объект только при заполнении, или всегда, и проверять тоже у него.
Вот тут для получения одного реквизита одного элемента мне конечно же надо запрос городить.
(3) Я тестированием производительности занимаюсь, а не добычей наименований всех сотрудников. У меня одинаковый код обвязки и отличие только в значимой части.

(4) Думается не лишнее. В выборку наименование считанно в момент "Выборка.следующий()" и обращаясь к наименованию из выборки я скорость получения данных из ссылки не замерю.
6 Fragster
 
гуру
25.12.13
17:14
(2) в типовых накидали функций уже
7 Maxus43
 
25.12.13
17:15
>>как правильно, получать объект только при заполнении, или всегда, и проверять тоже у него
даже логически - только при заполнеии. Не надо получать объект, если не собираешся его изменять
8 Fragster
 
гуру
25.12.13
17:15
а вот почему через СправочникВыборка получение быстрее, кушает меньше памяти и ничего на диск не пишет - вот это вопрос...
9 Fragster
 
гуру
25.12.13
17:16
(8)+ вернее вопрос, почему получение через ссылку выполняется в 3 раа дольше и пишет что-то на диск усиленно
10 H A D G E H O G s
 
25.12.13
17:29
(9) пишет или читает?

может в кэше ищет.
11 Fragster
 
гуру
25.12.13
17:36
(10) пишет
12 Defender aka LINN
 
26.12.13
07:59
(5) На пальцах: Выборка и так объекты тебе в память читает. Ежу понятно, что получение объекта быстрее будет.