![]() |
![]() |
![]() |
|
Анализ кода: Неужели так быстрее? | ☑ | ||
---|---|---|---|---|
0
Ksandr
28.03.10
✎
16:22
|
Из книжки по 8.2 товарища Радченко.
Запрос = Новый Запрос; Запрос.УстановитьПараметр("ТекущийДокумент", Ссылка); Запрос.Текст = "ВЫБРАТЬ | Дата |ИЗ | Документ.ВводНачальныхОстатковНоменклатуры |ГДЕ Ссылка = &ТекущийДокумент"; Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); Неужели это быстрее чем Объект.Дата ? |
|||
1
IamAlexy
28.03.10
✎
16:23
|
суть то одна и та же
|
|||
2
Fragster
гуру
28.03.10
✎
16:23
|
(0) в теории на больших выборках - быстрее
|
|||
3
Fragster
гуру
28.03.10
✎
16:24
|
потому что Объект.дата - заставит закешировать весь объект, а запрос - только прочитает дату, и все
|
|||
4
Ksandr
28.03.10
✎
16:24
|
(2) На больших, где обращаться приходится к множеству полей - да, а когда одно поле.
Хотя - да. с (3) Согласен. |
|||
5
vde69
28.03.10
✎
16:26
|
оператор:
дата = обьект.дата затянет на клиент весь обьект и потом получит дату, а в обьекте может быть ТЧ на 10 000 строк или бинарные данные... а вот по чему не сделать дата = ссылка.дата я не понимаю |
|||
6
vde69
28.03.10
✎
16:27
|
(3) точно, вопрос именно в кеше сервера, и его вытеснении...
|
|||
7
Fragster
гуру
28.03.10
✎
16:29
|
(5) ТЧ подтягиваться не будет
|
|||
8
Один С
28.03.10
✎
16:29
|
я думаю, проблема ваще не в том что Объект тянет весь объект.
а в том, что запросом получаются реальные данные, которые записаны. если открыть док и поменять дату не записывая, то ваш "объект.дата" вернет новую дату. а запрос старую. как то так... |
|||
9
vde69
28.03.10
✎
16:30
|
(7) ну бинарный реквизит на 100 метров с картинкой :)
|
|||
10
Ksandr
28.03.10
✎
16:33
|
(8) А иным способом получить хранимые в базе значения нельзя?
|
|||
11
Defender aka LINN
28.03.10
✎
16:36
|
(5) "а вот по чему не сделать дата = ссылка.дата" - потому что тогда из БД будут считаны ВСЕ реквизиты
|
|||
12
Jolly Roger
28.03.10
✎
16:38
|
(0) это не столько быстрее, сколько правильнее...
|
|||
13
Злопчинский
28.03.10
✎
16:40
|
(12) каков критерий "правильности"?
|
|||
14
Jolly Roger
28.03.10
✎
16:42
|
(13) у меня на подобные вопросы всегда один ответ: дорогу правильнее переходить на зеленый свет. кто не согласен, может переходить и на красный...
|
|||
15
Злопчинский
28.03.10
✎
16:45
|
(14) неверно, переход на зеленый свет - не есть правильно с точки зреняи пешехода. С точки зреняи пешехода переход на зеленый свет + отсутствие авто мчащихся на зеленый свет.
. поэтому правильнее на зеленый свет переходить именно потому, что не цвет зеленый, а что в это время машины стоять должны. т.е. существует достаточно внятный критерий "правильности" перехода на зеленый свет. . вопрос снова: каков внятный критерий "правильности" сабжа? |
|||
16
Defender aka LINN
28.03.10
✎
16:49
|
(15) Быстрее и таки правильнее. Запрос получает данные из БД, если их брать из объекта - есть вероятность, что реквизит изменился.
Кроме того, такой код можно легко перенести в другое место, если у тебя везде будет натыкано "Объект.Реквизит", то будешь потом переделывать. Ну и вообще, есть методические указания, открой глаза и прочитай. |
|||
17
Jolly Roger
28.03.10
✎
16:49
|
(15) я ж говорю: кто не согласен - сам себе злобный буратино. пусть переходит на красный. почему правильнее выбирать запросом в данном конкретном случае - ответ очевиден тому, кто понимает суть происходящего в том и другом случае...
|
|||
18
Злопчинский
28.03.10
✎
17:02
|
(17) злой ты.. ;-)
|
|||
19
H A D G E H O G s
28.03.10
✎
18:00
|
Быстрее, при любом размере выборки.
|
|||
20
Fragster
гуру
28.03.10
✎
18:02
|
(19) я имел ввиду, что есть места, где разницей можно принебречь
|
|||
21
Злопчинский
28.03.10
✎
18:06
|
(19) а почему быстрее?
|
|||
22
Mitriy
28.03.10
✎
18:18
|
(21) см. (11)
|
|||
23
Злопчинский
28.03.10
✎
18:25
|
т.е. только за счет того, что чтение производится именно для конкретно указанного реквизита?
|
|||
24
Fragster
гуру
28.03.10
✎
18:33
|
(23) не используется кеш и все механизмы, с ним связанные
|
|||
25
gae
28.03.10
✎
21:59
|
(11) >>"а вот по чему не сделать дата = ссылка.дата" - потому что тогда из БД будут считаны ВСЕ реквизиты
Это точно? |
|||
26
gae
28.03.10
✎
22:07
|
(25) :) Да, точно. Стр. 41 в "проф разработке".
|
|||
27
Stepa86
28.03.10
✎
22:09
|
(0) код конечно быстрее отрабатывает и в 8.2 на тонком и веб-клиенте свои заморочки (код в (0) наверно тянет данные из текущей строки таблицы формы)... но я предпочитаю сначала написать код быстро и правильно (то есть обычно я б написал объект.дата), а уже потом заниматься производительностью, если нужно.
|
|||
28
Stepa86
28.03.10
✎
22:13
|
(14) если нужно перейти дорогу, то я ее просто перейду, если вдруг возникают проблемы (сбили пару раз например), то тогда только начну искать светофор, переход и прочее... может мне изначально нужно перейти дорогу, на которой машины то раз в месяц появляются
|
|||
29
Stepa86
28.03.10
✎
22:17
|
(16) от того, что напишешь ссылка.Дата или код в (0) связность не изменится, поэтому даже если я перенесу код в другое место, то он перестанет работать при некорректной "Ссылка" в обоих случаях... вот если из контекста тянуть данные (обращаться просто Дата), то связность увеличивается со всеми вытекающими
|
|||
30
gae
28.03.10
✎
22:29
|
Вообще, в типовых на 8.1, при работе с формой, не считается зазорным получать данные "через точку"
РеализацияНаЭкспорт = ?(ЕстьДоговорКонтрагента, ?(ДокументОбъект.ДоговорКонтрагента.РеализацияНаЭкспорт = Истина, Истина, Ложь), Ложь); а также использование тяжелых конструкций типа ИмяТабличнойЧасти = Метаданные.НайтиПоТипу(ТипЗнч(СтрокаТабличнойЧасти)).Имя; Не считается критичным. При записи-проведении другое дело. |
|||
31
Jolly Roger
28.03.10
✎
22:36
|
(28) бугага! завязывай с игрухами, это опасно! в реале второго раза может и не быть....
|
|||
32
mikecool
28.03.10
✎
22:45
|
(27) "но я предпочитаю сначала написать код быстро и правильно (то есть обычно я б написал объект.дата), а уже потом заниматься производительностью, если нужно." - видно не работал никогда в большом проекте с жестким контролем качества и штрафами за лаги...
|
|||
33
Defender aka LINN
28.03.10
✎
22:46
|
(29) Если делать через запрос, то изменение потребуется только в одном месте - при установке параметра. В твоем варианте - везде.
|
|||
34
Stepa86
28.03.10
✎
22:50
|
(31) программирование немного не похоже на реальность... первый раз обычно ловится на тестировании
(32) а что есть большой проект? и почему эти принципы не подходит к большим проектам? |
|||
35
Armando
28.03.10
✎
22:52
|
(0) Почитай ИТС: 'Особенности использования типов данных, предназначенных для манипулирования объектами базы данных' и 'В каких случаях использовать ссылку, запрос, выборку и объект'.
И Радченко по 8.2: стр. 440. Устройство кеша. |
|||
36
Stepa86
28.03.10
✎
22:54
|
(33) в смысле везде? в одном месте, где идет обращение к дате через точку... если код в (0) вынесен в отдельным метод доступа, то и Ссылка.Дата тоже можно рассматривать как метод доступа
|
|||
37
Stepa86
28.03.10
✎
22:57
|
(32) штрафовать программиста за ошибки... да я б там сразу всех послал и ушел с такого проекта...
|
|||
38
misha122062
28.03.10
✎
23:10
|
(37)+1000
Там и текучка дай боже - сталкивался с подобными фирмами. Реализовавали в всемером большой проект и никто не штрафовал - потому что сразу сказали - баги будут. Контролируйте данные. На это и есть отладка |
|||
39
SnarkHunter
28.03.10
✎
23:11
|
>> Послал бы и ушел...
Да вот никто не берет... |
|||
40
Defender aka LINN
28.03.10
✎
23:13
|
(36) Тебе и правда нужен будет один реквизит объекта? Или все же несколько?
И вообще - на ИТС есть статья, в которой описываются рекомендации, потрудись ее прочесть. (38) Тебя не штрафовать, тебя сразу гнать надо. |
|||
41
Masquerade
28.03.10
✎
23:35
|
(37)
Ошибки - они разные бывают. |
|||
42
Эстет хренов
29.03.10
✎
00:45
|
(0) ужасно, это методологические недоработки разработчиков.
пусть напишут нормальный геттер для реквизита (списка реквизитов). |
|||
43
YauheniL
29.03.10
✎
01:12
|
Вот никогда не понимал в модуле проведения вот такой код (почти цитата):
... ТекСклад = Ссылка.Склад; ТекКонтрагент = Ссылка.Контрагент; ТекДоговор = Ссылка.ДоговорКонтрагента; ... Недоумение возникает на счет использования несколько раз конструкции Сссылка.Реквизит. Для чего? Ведь при проведении документ уже записан? |
|||
44
Stepa86
29.03.10
✎
08:20
|
(40) ты всегда пишешь обращение к реквизиту какого либо объекта через запрос, а не через точку? в этой ситуации запрос vs через точку лично я вижу только плюс сл стороны запроса - быстрее отрабатывает, со стороны "через точку" - код ооочень простой и понятный и его легко можно будет модифицировать потом, при появлении проблем (про рефакторинг потрудись сам почитать что нить), если нужно...
Пример. Есть 2 программиста: П1 и П2. производительность абсолютно одинакова, задача поставлена абсолютно одинакова, но П1 каждую строчку кода пытается написать так, чтобы она работала быстрее (тратит при этом время на разработку + время на оптимизацию (Р + О)). П2 просто пишет код не заморачиваясь оптимизацией - время разработки Р. После того как П2 реализовал функционал и прогнал тесты он обнаружил, что узких мест в коде всего 20% от всего кода (правило 20/80), которые и нужно оптимизировать. Итого П2 потратит на разработку колвоСтрок * (Р + 0.2*О)), а у П1 колвоСтрок * (Р + О)). На выходе о обоих программистов одинаковые решения. (41) вообще то не считаю обращение к реквизиту объекта через точку в общем случае ошибкой. иногда в каком либо контексте может быть, но не по умолчанию... |
|||
45
Jolly Roger
29.03.10
✎
08:47
|
(44) безусловно, ты прав. но выбор способа решения сабжа зависит от понимания внутренних механизмов восьмерки...
|
|||
46
Ksandr
29.03.10
✎
08:55
|
Еще кстати встречал в книжке такого плана код:
в запросе: ЧтоТо.Количество ЧтоТо.Цена А потом в переборе выборки результата: Выборка.Количество * Выборка.Цена А в запросе не эффективнее? |
|||
47
Ksandr
29.03.10
✎
08:55
|
+ к (46) При этом поля по отдельности не используются
|
|||
48
hhhh
29.03.10
✎
09:38
|
(46) для больших массивов, например
Для к = 0 ПО 1000 Цикл ЧтоТо = массивСсылок[к]; ЧтоТо.Количество ЧтоТо.Цена КонецЦикла; будет тормозить не по-детски. При варианте с Выборкой тормозить не будет. |
|||
49
Serg_1960
29.03.10
✎
09:47
|
Хм... Удивляюсь, что еще никто не послал автора :) в отладку - в замер производительности.
|
|||
50
Defender aka LINN
29.03.10
✎
09:52
|
(44) "ты всегда пишешь обращение к реквизиту какого либо объекта через запрос, а не через точку?" - да.
Про производительность - бред. Атомный. |
|||
51
Господин ПЖ
29.03.10
✎
09:53
|
интересно как утверждение из (0) будет выглядеть на 8.2... ДокОбъект.Код все равно на сервере сидит
|
|||
52
Господин ПЖ
29.03.10
✎
09:56
|
кстати 8.2 вполне может увеличить кол-во "плохого кода". Проще написать на клиенте с помощью "magic number" логику чем нырять за каждой мелочью на сервер
|
|||
53
Stepa86
29.03.10
✎
09:57
|
(51) запрос на тонком клиенте тож не особо работает, да и вообще ветка в рамках 8.2
|
|||
54
Stepa86
29.03.10
✎
09:58
|
(52) я для этих целей кэшируемый модуль использую
|
|||
55
Господин ПЖ
29.03.10
✎
10:00
|
(54) это которых хранит результат? А как он все таки работает если в сигнатуре пользуются структуры?
|
|||
56
Stepa86
29.03.10
✎
10:02
|
(55) коллекции не использую просто, есть подозрение, что толку не будет от таких методов, даже кешируемых
|
|||
57
Stepa86
29.03.10
✎
10:14
|
(50) "Про производительность - бред. Атомный." и что бредового? это как бэ не я придумал, а вычитал у Макконнелла ( http://ru.wikipedia.org/wiki/Макконнелл,_Стив ), Кента Бека ( Kent Beck ) и Фаулера ( http://ru.wikipedia.org/wiki/Фаулер,_Мартин ) или они все ничего не понимают в программировании???
|
|||
58
Serg_1960
29.03.10
✎
10:54
|
(подколка) Ооо... Данные господа изучали 1С? Не знал :)
|
|||
59
Stepa86
29.03.10
✎
10:59
|
(58) данные господа изучали программирование в целом, а не конкретный инструмент... Вы же не будете учится готовить по инструкции к микроволновке?
|
|||
60
Serg_1960
29.03.10
✎
11:18
|
Тонкий юмор не дощел :)
"безусловно, ты прав. Но выбор способа решения сабжа зависит от понимания внутренних механизмов восьмерки" ( Jolly Roger ) |
|||
61
Ksandr
29.03.10
✎
11:32
|
(48) Речь о выборке результатов запроса
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |