if vs логическое выражение с функцией

1. Skot Skukota 25.09.18 16:04 Сейчас в теме
Хочется переписать код без Если.

Пример кода
Есть процедура ПосчитатьЭлемент(Элемент )
Для Каждого Элемент Из Элементы Цикл
....
Если Ответ Тогда
ПосчитатьЭлемент(Элемент )
КонецЕсли;

КонецЦикла;

Если заменить на
Есть функция ПосчитатьЭлемент(Элемент )
Для Каждого Элемент Из Элементы Цикл
....
Результат = Ответ И ПосчитатьЭлемент(Элемент );

КонецЦикла;

При таком подходе будет увеличение производительности вычисления, за счет конвееризации ЦП, или нет?
примечание код ПосчитатьЭлемент(Элемент ) обрабатывает только переменные в памяти, нет обращений к базе. Сам расчет критический по времени.
+
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. Сурикат 394 25.09.18 16:12 Сейчас в теме
А вы возьмите и перепишите =)
Если что-то и есть с производительностью, то думать об этом не стоит, т.к. это такие наносекнуды...
+
15. Dream_kz 129 25.09.18 17:40 Сейчас в теме
(1) А еще если цикл переписать в одну строку, то тоже работать будет быстрее, но это не читабельно.
user843810; alex-l19041; Healer; acanta; +4
26. caponid 27.09.18 15:54 Сейчас в теме
(15) да, будет быстрее, но есть нюанс....
Быстрее только в случае отладки, разница возникает на накладные расходы трассировки....
+
27. spacecraft 27.09.18 16:03 Сейчас в теме
(26) не только. Будет реально быстрее и продакшине. Где-то в 10 раз. Проводил в свое время тесты. Без режима отладки, только вычислением времени выполнения.
Но это на большем числе циклов заметно.
+
22. Vitaly1C8 26.09.18 14:34 Сейчас в теме
(1) Второй вариант кода будет работать дольше первого если хотя бы раз в цикле Ответ будет равен Ложь;
Приведенные два варианта кода, - не являются идентичными ! Потому что во-втором варианте ПосчитатьЭлемент(Элемент); вызывается всегда, а в первом только когда Ответ = Истина
+
25. Sashares 34 26.09.18 17:27 Сейчас в теме
2. vadim1011985 99 25.09.18 16:08 Сейчас в теме
Ну если думать логически то 2-ой способ дольше так как в любом случае будет выполняться функция посчитатьЭлемент но это может занимать какие-то доли секунды и этим можно принебречь
+
3. Skot Skukota 25.09.18 16:12 Сейчас в теме
(2)Столкнулся на проекте с громоздкими вычислениями. Где то хотелось бы без if.
Где то пока не получилось обойти это. Стало очевидно второе решение. А работает ли оно или просто фича.
+
5. Timur.V 78 25.09.18 16:17 Сейчас в теме
(3)
ПосчитатьЭлемент(Элемент );

Не понятно что делает эта функция.

Если внутри происходит выборка из базы, у вас обрабатывается это построчно.
Можно попробовать собрать все подходящие записи в таблицу значений и передать её в ПосчитатьЭлемент.
И обратно вернуть результат в виде таблицы результата.
Т.е получится не построчная, а групповая обработка данных.
+
8. Skot Skukota 25.09.18 16:20 Сейчас в теме
(5)
выборка из базы
Не выборка из базы. Операции сложного расчета все на переменных.
На самом деле была мысль схалтурить фичей. Если чудом работает, было бы супер.
+
11. Sashares 34 25.09.18 16:23 Сейчас в теме
(8) Каких-то чудес прибавления производительности только при описанном изменении ожидать ваще не стоит.
+
12. Skot Skukota 25.09.18 16:27 Сейчас в теме
(11)Понятно фича, когда то удобно бывает.
Думать надо мозгом, а не искать чудес ясно.
+
20. Xershi 1483 26.09.18 14:10 Сейчас в теме
(3) код записанный в одну строку выполняется всегда быстрее. А второе условие проверяется только если первое подошло, если поменяете местами, то заметите уменьшение производительности.
+
6. Sashares 34 25.09.18 16:18 Сейчас в теме
(2) На самом деле не в любом. Т.к. условие по И, то если первое выражение Ложь, то остальные выражения платформа считает далеко не всегда.
+
9. vadim1011985 99 25.09.18 16:21 Сейчас в теме
(6) не знаю , спорить не буду , в Python точно есть такое , а вот в 1с под вопросом , но это можно проверить
+
7. DenisCh 25.09.18 16:20 Сейчас в теме
(2) Не будет в любом случае. В 1с8 логические выражения вычисляются лениво
+
10. Skot Skukota 25.09.18 16:21 Сейчас в теме
(7)хорошо, значит надо думать.
+
13. vadim1011985 99 25.09.18 16:40 Сейчас в теме
(7)
1с8 логические выражения вычисляются лениво
Да, придется согласиться , сейчас проверил , действительно вычисляются лениво
+
14. DenisCh 25.09.18 17:07 Сейчас в теме
(13) Тут не надо соглашаться, достаточно прочитать мануалы, там это явно написано
+
21. lishniy 132 26.09.18 14:18 Сейчас в теме
(2) Нет, это не так. Если первая часть выражения вернет ложь, то вторая выполняться не будет. Например:
Процедура КнопкаВыполнитьНажатие(Кнопка)
	Сообщить("Начало");
	н=0;
	Пока н < 5 Цикл
		Результат = (н = 3) И ПоказатьСообщение(н);
		Сообщить("Результат цикла " + н + " = " + Результат);
		н = н + 1;
	КонецЦикла;
	
	Сообщить("Конец");
КонецПроцедуры

Функция ПоказатьСообщение(НомерЦикла)
	Сообщить("Выполняется цикл номер " + НомерЦикла);
	Возврат Истина;
КонецФункции
Показать

В результате будет
Начало
Результат цикла 0 = Нет
Результат цикла 1 = Нет
Результат цикла 2 = Нет
Выполняется цикл номер 3
Результат цикла 3 = Да
Результат цикла 4 = Нет
Конец
+
23. vadim1011985 99 26.09.18 14:47 Сейчас в теме
(21) Я уже понял , был неправ , уже написал об этом , почитал справку к логическим функциям
+
16. YanTsys 12 26.09.18 10:26 Сейчас в теме
(57) открою секрет, в 1с есть инструменты для замера скорости выполнения кода, если вы проведете исследование и выложите здесь результаты всем будет интересно.

Только при сравнении скорости замените
Если Ответ Тогда
ПосчитатьЭлемент(Элемент )
КонецЕсли;

на
Если Ответ Тогда Результат=ПосчитатьЭлемент(Элемент) КонецЕсли;

для 1с всё таки есть разница в скорости исполнения кода записанного в одну или в несколько строк.
Healer; +1
17. ADirks 186 26.09.18 10:59 Сейчас в теме
(16) вот это кстати вообще гитлеркапут.... как можно было такое учудить, в моей голове не укладывается
причём разница, как я понимаю, достаточно драматична
+
19. Ditron 184 26.09.18 14:00 Сейчас в теме
(17)ну почему, все логично, интерпретатор строки обходит? обходит... а так одна строка, а если вообще сохранить модуль без исходного кода, будет еще быстрей ;-)
+
24. YanTsys 12 26.09.18 16:43 Сейчас в теме
(17) Как раз для того и ставятся эксперименты чтобы понять насколько велика или несущественна разница, а не разводить театр и демагогию на пустом месте.
+
18. Ditron 184 26.09.18 13:57 Сейчас в теме
Нет никакой разницы! Интерпретатор переработает все равно, и итог этого будет одинаков, конструкция Результат = (А > 0) и Если А > 0 Тогда Результат = Истина Иначе Результат = Ложь КонецЕсли. разницы не будет, прирост (как уже сказали) будет только в интерпретации кода платформой (это как писать в одну строку), но это будет совсем незаметно. И кстати платформа не обрабатывает второе условие если не сработало первое, например:
Если ТекущиеДанные <> Неопределено И ТекущиеДанные.Количество > 0 Тогда
....
КонецЕсли;

Никогда не будет ошибки исключения если ТекущиеДанные = Неопределено, потому что второе условие после "И" никогда не проверяется, если первое не ИСТИНА
antz; +1
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот