|
Помогите оптимизировать код | ☑ | ||
---|---|---|---|---|
0
only82
17.09.11
✎
19:37
|
Написал такую процедуру.
Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза) Если Строка(ТипЗнч(ЭлементДанных)) = "Справочник объект: Физические лица" Тогда ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ЭлементДанных.НаселенныйПункт.Район); ИначеЕсли Строка(ТипЗнч(ЭлементДанных)) = "Справочник объект: Населенные пункты" Тогда ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ЭлементДанных.Район); ИначеЕсли Строка(ТипЗнч(ЭлементДанных)) = "Справочник объект: Районы" Тогда ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ЭлементДанных.Ссылка); ИначеЕсли Строка(ТипЗнч(ЭлементДанных)) = "Справочник объект: Сельсоветы" Тогда ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ЭлементДанных.Район); ИначеЕсли Строка(ТипЗнч(ЭлементДанных)) = "Регистр сведений набор записей: Штрихкоды" Тогда ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ЭлементДанных.Отбор.Владелец.Значение.НаселенныйПункт.Район); ИначеЕсли Строка(ТипЗнч(ЭлементДанных)) = "Регистр сведений набор записей: Фамилия, имя, отчество физического лица" Тогда ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ЭлементДанных.Отбор.ФизЛицо.Значение.НаселенныйПункт.Район); ИначеЕсли Строка(ТипЗнч(ЭлементДанных)) = "Регистр сведений набор записей: Состояние" Тогда ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ЭлементДанных.Отбор.ФИО.Значение.НаселенныйПункт.Район); КонецЕсли; КонецПроцедуры Думаю, что есть более простой вариант, чем 6 раз использовать ИначеЕсли. Причем объектов будет больше и условий соответственно тоже. |
|||
1
Grusswelle
17.09.11
✎
19:39
|
(0) Нормально так ты на тонком клиенте херачишь...
|
|||
2
poligraf
17.09.11
✎
19:39
|
(0) ты в субботу вечером хочешь помощи или чтобы постебались?
Можно оптимизировать. Смотреть в сторону массивов/таблиц значений/соответствий и т.д. |
|||
3
trambalda
17.09.11
✎
19:39
|
А что с типом Тип нельзя сравнивать? Обязательно строки мучать?
|
|||
4
Рэйв
17.09.11
✎
19:39
|
>>Строка(ТипЗнч(ЭлементДанных)) = "Справочник объект: Физические лица"
уже пять:-) Читай радчеко чтоли. |
|||
5
poligraf
17.09.11
✎
19:40
|
(1) поделись мудростью: по такому коду как тип клиента определить?:)
(2) это более продвинутые уровни. |
|||
6
only82
17.09.11
✎
19:42
|
(1) Тонкий
|
|||
7
only82
17.09.11
✎
19:43
|
(4) Какая разница что сравнивать. Вопрос совсем другой
|
|||
8
Grusswelle
17.09.11
✎
19:43
|
(5) -> (6) Вот видишь! :-))
ЗЫ: Не поделюсь! :-Р |
|||
9
Rie
17.09.11
✎
19:43
|
(2) Построение массива/таблицы значений/соответствия - займёт не меньше времени, чем подобный перебор. IMHO.
(0) "Лучшее - враг хорошего". Детали разве что можешь подрихтовать. |
|||
10
only82
17.09.11
✎
19:45
|
Если б был оператор типа case of
|
|||
11
trambalda
17.09.11
✎
19:45
|
(7) ИначеЕсли нормальное решение, надо оптимизировать выражения
|
|||
12
Рэйв
17.09.11
✎
19:45
|
(7)Действиельно..Какая разница? Ну и живи дураком.
|
|||
13
popcorn
17.09.11
✎
19:47
|
(0) используй соответствие которое создается независимо от процедуры ПриОтправкеДанныхПодчиненному один раз, и потом в процедуре используется сколько угодно.
|
|||
14
only82
17.09.11
✎
19:47
|
(12) Я думаю если сравнивать объекты метаданных а не строки - это на скорости никак не отразится
|
|||
15
Рэйв
17.09.11
✎
19:49
|
(12)Вопрос спорный. Сам не мерил..Так что.
|
|||
16
poligraf
17.09.11
✎
19:49
|
(9) т.е. предлагаешь при каждом вызове процедуры заново отстраивать...
Эх... Кто придумывал кэширование данных тебя не послушались. Дураки. (11) В ассемблере по тактам не оптимизировал код:) |
|||
17
Рэйв
17.09.11
✎
19:49
|
(15)->(14)
|
|||
18
popcorn
17.09.11
✎
19:49
|
(0) еще можно вынести расчет выражения Строка(ТипЗнч(ЭлементДанных)) за блок "Если", то будет оптимальнее.
Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза) ячячяч = Строка(ТипЗнч(ЭлементДанных)) Если ячячяч = "Справочник объект: Физические лица" Тогда ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ЭлементДанных.НаселенныйПункт.Район); ИначеЕсли ячячяч = "Справочник объект: Населенные пункты" Тогда ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ЭлементДанных.Район); ............... |
|||
19
Рэйв
17.09.11
✎
19:51
|
(18)много грибов съел перед этим?
|
|||
20
popcorn
17.09.11
✎
19:52
|
(19) ну съел немного шампиньонов, а что?
|
|||
21
Рэйв
17.09.11
✎
19:52
|
(20)Заметно
|
|||
22
Rie
17.09.11
✎
19:53
|
(16) Что именно "заново отстраивать"? Чем будешь это соответствие/таблицу заполнять - для данного случая? Когда у него то ЭлементДанных.НаселенныйПункт.Район, то ЭлементДанных.Отбор.ФизЛицо.Значение.НаселенныйПункт.Район?
|
|||
23
popcorn
17.09.11
✎
19:53
|
(21) чем?
|
|||
24
poligraf
17.09.11
✎
19:54
|
(18) думать не хочется, но еще на ступеньку оптимальней будет
Выполнить(НекаяКоллекция[ячячяч]) |
|||
25
Rie
17.09.11
✎
19:55
|
(24) Выполнить - разве что затормозит.
|
|||
26
Рэйв
17.09.11
✎
19:56
|
ну вы тут поспорьте, ребята, я пока за пивом схожу. Чуется мне будут общие темы.
|
|||
27
Рэйв
17.09.11
✎
19:56
|
-20 минут
|
|||
28
only82
17.09.11
✎
20:00
|
Еще думал над вариантом перебирать все реквизиты для каждого объекта и искать среди них СправочникСсылка.Район, тогда для новых объектов не нужно будет ничего прописывать ПриОтправкеДанныхПодчиненному. Но думаю что это еще больше будет тормозить работу
|
|||
29
popcorn
17.09.11
✎
20:01
|
Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза)
зщзщ = Строка(ТипЗнч(ЭлементДанных)) ячячяч = Новый Соответствие(); ячячяч["Справочник объект: Физические лица"] = ЭлементДанных.НаселенныйПункт.Район; ячячяч["Справочник объект: Населенные пункты"] = ЭлементДанных.Район; ячячяч["Справочник объект: Районы"] = ЭлементДанных.Ссылка; ячячяч["Справочник объект: Сельсоветы"] = ЭлементДанных.Район; ........................ ........................ ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ячячяч[зщзщ] ); КонецПроцедуры |
|||
30
Rie
17.09.11
✎
20:02
|
(29) Всё это строится при каждом вызове процедуры и наружу его не вынесешь.
|
|||
31
Rie
17.09.11
✎
20:03
|
(28) Оптимизируй проверяемые выражения.
А Если ... Тогда - работает достаточно быстро. И уж явно побыстрее всяких Выполнить, и уж тем более циклов по метаданным. |
|||
32
popcorn
17.09.11
✎
20:03
|
(30) ну и хрен с ним. Пусть будет. Зато красиво и без кучи ИначиЕсли
|
|||
33
Rie
17.09.11
✎
20:04
|
(32) И существенно тормознутее.
|
|||
34
only82
17.09.11
✎
20:04
|
(29) Сразу выдаст ошибку. Если объект ФизЛицо и я напишу
ячячяч["Справочник объект: Населенные пункты"] = ЭлементДанных.Район; оно ругнеться что нет реквизита Район |
|||
35
popcorn
17.09.11
✎
20:06
|
(34) пропиши во все объекты реквизит .Район и присвой ему район который каждый раз в непонять где у тебя.
|
|||
36
Rie
17.09.11
✎
20:06
|
(34) У тебя в (0) - нормальный вариант. Только замени сравнение строк сравнением типов - и наступит счастье.
|
|||
37
Rie
17.09.11
✎
20:07
|
(35) Издеваешься?
|
|||
38
popcorn
17.09.11
✎
20:07
|
(36) тогда лучше как (18)
|
|||
39
popcorn
17.09.11
✎
20:08
|
(37) так не придется городить процедуру с перебором
|
|||
40
Rie
17.09.11
✎
20:08
|
(38) Тогда лучше ТипЗнч(...)=Тип(...) и не мучить строки.
|
|||
41
Rie
17.09.11
✎
20:09
|
(39) А что плохого в процедуре с перебором? В данном случае, IMHO, это как раз лучшее решение.
|
|||
42
popcorn
17.09.11
✎
20:09
|
(40) Тип(...) быстрее выполняется чем константа строка?
|
|||
43
popcorn
17.09.11
✎
20:11
|
(41) плохого в том что это перебор вместо прямого обращения к реквизиту.
|
|||
44
Rie
17.09.11
✎
20:12
|
(42) Не чем константа, а чем получение представления типа из типа и сравнение строк.
|
|||
45
popcorn
17.09.11
✎
20:13
|
(44) представление типа вынимается всего один раз, а затем только строки сравниваются. Ты тоже грибы ел?
|
|||
46
Rie
17.09.11
✎
20:14
|
(43) Дык нет реквизита-то. У него ведь и ЭлементДанных.Отбор.Владелец.Значение.НаселенныйПункт.Район имеется. А всобачивать реквизиты повсюду ради одной (вспомогательной) процедуры - это как-то не интеллигентно.
Перебор же - ничем не плох. Наоборот - поскольку перечень условий, если верить (0), будет пополняться, перебор окажется весьма гибким решением. |
|||
47
Fynjy
17.09.11
✎
20:14
|
Метаданные.Документы.Содержит() ... Строки изврат ...
|
|||
48
Rie
17.09.11
✎
20:15
|
(45) Один раз. Но - таки выполняется?
Ну и сравнение строк - нисколько не быстрее сравнения типов. |
|||
49
popcorn
17.09.11
✎
20:16
|
(46) почему не интеллигентно? Можно и всобачить если это поможет быстродействию.
|
|||
50
popcorn
17.09.11
✎
20:18
|
(48) Таки да, примерно одинаково получается.
Что, думаешь "Выполнить" один раз будет медленнее чем несколько повторных сравнений? |
|||
51
Rie
17.09.11
✎
20:19
|
(49) Посмотри в (0) - куда этот Район всобачивать придётся. И это ведь неполный список. И ведь Район надо будет заполнять. Так что выигрыша в быстродействии что-то не видать.
|
|||
52
only82
17.09.11
✎
20:19
|
Изначально вопрос был совсем о другом, а все зациклились на том какие типы лучше сравнивать.
Решил оставить как есть. |
|||
53
Rie
17.09.11
✎
20:19
|
(50) Выполнить - конечно медленнее. Ему ведь разобрать свой параметр надо (каждый раз!) - а это не самый лёгкий труд. Сравнения же - уже скомпилированы.
|
|||
54
Rie
17.09.11
✎
20:20
|
(52) И правильно сделал! Ибо это - лучшее, что можно придумать. IMHO.
|
|||
55
popcorn
17.09.11
✎
20:20
|
(51) Если ты не видишь выигрыша в быстродействии если всю процедуру заменить одним выражением, то спорить бесполезно.
|
|||
56
popcorn
17.09.11
✎
20:21
|
(53) И во сколько раз выполнить медленнее одного сравнения?
|
|||
57
popcorn
17.09.11
✎
20:22
|
(52) Воспользуйся хотябы советом (18) если оставляешь как есть
|
|||
58
Rie
17.09.11
✎
20:24
|
(56) А напиши хотя бы парсер хотя бы для простого арифметического выражения. И посмотри, во сколько раз медленнее.
|
|||
59
orefkov
17.09.11
✎
20:25
|
В языках с нормальным ООП вся бы эта конструкция записалась как:
ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ЭлементДанных.ПолучитьРайон()); И соответственно, каждый бы тип имел свою реализацию метода "ПолучитьРайон()" |
|||
60
crazy_killer
17.09.11
✎
20:25
|
(52) >> Решил оставить как есть.
рекомендацию из (18) все-таки лучше учесть |
|||
61
popcorn
17.09.11
✎
20:29
|
(59) кстати, да. Можно же в модуле объекта или его менеджера прописать процедуру к которой потом обращаться таким образом?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |