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 100 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 1486 26.09.18 14:10 Сейчас в теме
(3) код записанный в одну строку выполняется всегда быстрее. А второе условие проверяется только если первое подошло, если поменяете местами, то заметите уменьшение производительности.
6. Sashares 34 25.09.18 16:18 Сейчас в теме
(2) На самом деле не в любом. Т.к. условие по И, то если первое выражение Ложь, то остальные выражения платформа считает далеко не всегда.
9. vadim1011985 100 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 100 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 100 26.09.18 14:47 Сейчас в теме
(21) Я уже понял , был неправ , уже написал об этом , почитал справку к логическим функциям
16. YanTsys 12 26.09.18 10:26 Сейчас в теме
(57) открою секрет, в 1с есть инструменты для замера скорости выполнения кода, если вы проведете исследование и выложите здесь результаты всем будет интересно.

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

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

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

Никогда не будет ошибки исключения если ТекущиеДанные = Неопределено, потому что второе условие после "И" никогда не проверяется, если первое не ИСТИНА
Оставьте свое сообщение

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