Вход | Регистрация
    1  2
1С:Предприятие :: 1С:Предприятие 8 общая

Почему в замере производительности дольше всего выполняется элементарная операция?

Почему в замере производительности дольше всего выполняется элементарная операция?
Я
   anchar007
 
13.05.21 - 13:34
Оптимизирую самописную внешнюю обработку. Она на основании огромного количества документов за определенный период создаёт новые документы.
В примере на скрине мы создаём новые документы на основании 21000 поступлений и 26000 реализаций, поэтому в некоторые строки мы попадаем по 47000 раз.
Скрин: https://ibb.co/8MY5DN3
Почему замер производительности показывает, что элементарная операция сравнения "Если Валюта.Код = "643" Тогда" выполняется в разы дольше, чем например какие-нибудь сложные операции типа запросов, которые вызываются примерно такое же количество раз?
Запускал замер производительности уже не один раз и всегда сравнение со строкой самое длительное.
 
 Партнерская программа EFSOL Oblako
   ptiz
 
101 - 13.05.21 - 15:43
(0) Либо ошибка в замере, либо вы в справочник Валюты запихнули реквзит типа ХранилищеЗначений для картинок.
   Жан Пердежон
 
102 - 13.05.21 - 15:44
(97) а что там за запрос?
   BIP1
 
103 - 13.05.21 - 15:45
(99) про качество кода, вам уже написали.
Получайте всё, что можно В ЗАПРОСЕ, а не через извраты вида Строка.Документ.ИмяРеквизита.
   polosov
 
104 - 13.05.21 - 15:45
Явно проблема в "строка.Документ.ВалютаДокумента"
Замер просто не правильно отображает похоже.
   polosov
 
105 - 13.05.21 - 15:50
(97) Теоретически, если ты в ПересчитатьВалютнуюСумму()
Поставишь в начале 
А = 1;
То замер укажет на эту строку, как на наиболее жручую.
   anchar007
 
106 - 13.05.21 - 16:02
(99) и правда причина была в строка.Документ.ВалютаДокумента
Я думал, что если на вход в функцию ПересчитатьВалютнуюСумму передать две ссылки и их сравнить, то нет разницы каким образом эти ссылки были получены. А оказывается разница есть
   anchar007
 
107 - 13.05.21 - 16:06
(103) Понятно, что в можно переписать запрос и пересчитывать сумму в рубли уже в запросе.
Не понятно было почему замер производительности грешит на казалось бы простейшую операцию сравнения двух значений с одинаковым типом
   pechkin
 
108 - 13.05.21 - 16:06
(106) еще и дата получается
   anchar007
 
109 - 13.05.21 - 16:08
(108) получается да. Она не попадала в замер производительности, так как валютных операций не много
   BIP1
 
110 - 13.05.21 - 16:10
(107) Он не на неё грешил, а на Строка.Документ.ВалютаДокумента. Нам же значение параметра ВалютаДокумента требуется только в момент проверки условия, вот он и получает это значение в момент проверки условия, а не при вызове функции. Вдруг, например, нам это значение в функции нигде и не пригодится. Зачем лишний раз что-то считать? Ленивые вычисления
   BIP1
 
111 - 13.05.21 - 16:11
Сделайте замер цикла от 1 по 1000000 с 1 условием:


Если ИСТИНА ИЛИ Строка.Документ.ВалютаДокумента = Рубли Тогда

КонецЕсли;

А потом тоже самое с таким кодом:
Если ЛОЖЬ ИЛИ Строка.Документ.ВалютаДокумента = Рубли Тогда
КонецЕсли;

Результаты замеров будут разные
   Lama12
 
112 - 13.05.21 - 16:35
(111) :-D ну да, ИСТИНА выполняется быстрее чем ЛОЖЬ.
   mistеr
 
113 - 13.05.21 - 16:40
(107) Если действительно хочешь понять, показывай полный код.
   BIP1
 
114 - 13.05.21 - 16:43
(112) потому что зачем выполнять вторую половину условия, если результат будет и так и так ИСТИНА.
При оптимизации кода можно всякие "тяжелые" вычисления в "длинных" условиях стараться отодвигать как можно дальше, чтобы системе их считать приходилось как можно реже.
Но кто будет с таким заморачиваться🤷‍♂️
   Kassern
 
115 - 13.05.21 - 16:44
(114) это же вроде в одних из первых занятиях по 1с рассказывают...
   azernot
 
116 - 13.05.21 - 16:45
Во всех конфах на БСП есть функция типа ЗначенияРеквизитовОбъекта.
Каждый раз, когда возникает желание получать реквизит ссылки, нужно вспоминать об этой процедуре.

Т.е. к примеру делать так:

      СтруктураРеквизитовДокумента = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(строка.Документ, "ВалютаДокумента, Дата")


      НоваяСтрокаДокументы.СуммаПоУслуге = (-1)*ПересчитатьВалютнуюСумму(строка.СуммаУслуги, 
                                                СтруктураРеквизитовДокумента.ВалютаДокумента, 
                                                СтруктураРеквизитовДокумента.Дата);
   mistеr
 
117 - 13.05.21 - 16:47
(110) Похоже на правду
   Lama12
 
118 - 13.05.21 - 16:47
(115) Это даже в справке, встроенной написано.
   mistеr
 
119 - 13.05.21 - 16:48
(116) Этот позор архитектуры давно пора спрятать в платформу.
   azernot
 
120 - 13.05.21 - 16:49
(119) Кто ж спорит, но пока есть, что есть.
   RomanYS
 
121 - 13.05.21 - 16:53
(116) в данном случае глобально это картину не сильно изменит - всё равно 40к запросов к базе (только они чуть полегче). Эти данные безусловно должны быть в самой таблице
   polosov
 
122 - 13.05.21 - 16:54
(119) Тогда неучи его будут использовать как в (116)
По всем нужным документам одним запросом надо получить данные и потом использовать в своем цикле.
   Bigbro
 
123 - 13.05.21 - 17:25
27 тысяч запросов в цикле.. еще бы было быстро
   pechkin
 
124 - 13.05.21 - 17:27
ну если нужно 27 тыщ документов записать, то и поболее запросов будет
   mistеr
 
125 - 13.05.21 - 17:32
(122) Да, но платформа вполне способна проанализировать их цикл, собрать все используемые реквизиты и получить их неявно.
   RomanYS
 
126 - 13.05.21 - 17:42
(125) платформа с телепатией это круто, но пока только боты.
   BIP1
 
127 - 13.05.21 - 18:08
   PR
 
128 - 13.05.21 - 18:10
(119), (120), вы такие милые со своими авторитетными доморощенными мнениями, прямо ми-ми-ми
Прямо фузиной немножечко пахнуло
   polosov
 
129 - 13.05.21 - 18:13
(125) Это слишком сложно и не нужно.
   Dmitrii
 
130 - 13.05.21 - 18:39
(111) >> Результаты замеров будут разные.

Это очевидно. Для этого даже сам замер делать не нужно.
Только каким боком данный пример относится к обсуждению?
 
 
   DmVl76
 
131 - 14.05.21 - 06:16
(97) Кстати, а почему столько запросов в цикле. Судя по всему, по каждому документу запрос. Может сделать выборку одним запросом?
   DimVad
 
132 - 14.05.21 - 07:42
(111) Прошу прощения, но подозреваю что в условии :

Если ИСТИНА ИЛИ Строка.Документ.ВалютаДокумента = Рубли Тогда

КонецЕсли;

Выражение "Строка.Документ.ВалютаДокумента = Рубли" вообще вычисляться не будет.

Самое простое - пусть второе выражение после "ИЛИ" содержит ошибку (типа, ЗначениеЗаполнено на мутабельное).
Если впереди ИСТИНА - пройдёт со свистом. ЛОЖЬ - вылетит.
   DimVad
 
133 - 14.05.21 - 07:48
Кстати, если хочется получить значение через ссылку но лень писать запрос то есть же:

Код_ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(МояСсыль, "Код");
Структура_ = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(МояСсыль, "Код, Наименование");
   ДенисЧ
 
134 - 14.05.21 - 07:49
(133) А там типа не запросы...
   DimVad
 
135 - 14.05.21 - 07:51
(134) Но их не надо писать... :)

Не, если можно получить заранее один раз - то надо сохранить в переменную, без базара.
"ЗначениеРеквизитаОбъекта" спасает от загрузки лишней информации при получении данных через ссылку.
   BIP1
 
136 - 14.05.21 - 10:07
(132) Конечно. Просто этот пример в рамках обсуждаемого контекста, так сказать "в моменте", не более того. Если абстрактно "в вакууме" такие примеры показывать, то можно было и так: "ИСТИНА ИЛИ 1/0 = 1" vs "ЛОЖЬ ИЛИ 1/0 = 1"
   rozer76
 
137 - 14.05.21 - 11:45
(37) вот никогда не понимал а почему в теч 20сек 1с не проверяет версию объекта а выдает из кеша ?
https://its.1c.ru/db/pubdevguide83#content:303:hdoc
   timurhv
 
138 - 14.05.21 - 11:59
(5) На больших данных это долго работает в циклах. Оптимизировал условие через булево, условно:
"Если ЭтоВалютаРуб Тогда"
с помощью запроса, скорость проведения стала 7 сек вместо 11.
   mistеr
 
139 - 14.05.21 - 13:59
(137) Чтобы кэширование имело хоть какой-то смысл.
   pechkin
 
140 - 14.05.21 - 14:05
(137) так версию нужно же в бд получать
   Garikk
 
141 - 14.05.21 - 14:12
(137)(139) <Если окажется, что версии данных не совпадают (т. е. произошло изменение данных в базе данных), данные, находящиеся в кеше, будут удалены из него, и будет выполнено повторное считывание данных из базы данных. Начиная с этого момента, идет отсчет следующего 20-секундного интервала валидности этих данных.>

вы точно читаете всё что цитируете?
   rozer76
 
142 - 14.05.21 - 17:16
(141) ага, если данные изменились в 19ую секунду то 1с возмет их из кеша а не бд а это уже фейл (
  1  2

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.