Хочется переписать код без Если.
Пример кода
Есть процедура ПосчитатьЭлемент(Элемент )
Если заменить на
Есть функция ПосчитатьЭлемент(Элемент )
При таком подходе будет увеличение производительности вычисления, за счет конвееризации ЦП, или нет?
примечание код ПосчитатьЭлемент(Элемент ) обрабатывает только переменные в памяти, нет обращений к базе. Сам расчет критический по времени.
Пример кода
Есть процедура ПосчитатьЭлемент(Элемент )
Для Каждого Элемент Из Элементы Цикл
....
Если Ответ Тогда
ПосчитатьЭлемент(Элемент )
КонецЕсли;
КонецЦикла;
Если заменить на
Есть функция ПосчитатьЭлемент(Элемент )
Для Каждого Элемент Из Элементы Цикл
....
Результат = Ответ И ПосчитатьЭлемент(Элемент );
КонецЦикла;
При таком подходе будет увеличение производительности вычисления, за счет конвееризации ЦП, или нет?
примечание код ПосчитатьЭлемент(Элемент ) обрабатывает только переменные в памяти, нет обращений к базе. Сам расчет критический по времени.
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
А вы возьмите и перепишите =)
Если что-то и есть с производительностью, то думать об этом не стоит, т.к. это такие наносекнуды...
Если что-то и есть с производительностью, то думать об этом не стоит, т.к. это такие наносекнуды...
(1) Второй вариант кода будет работать дольше первого если хотя бы раз в цикле Ответ будет равен Ложь;
Приведенные два варианта кода, - не являются идентичными ! Потому что во-втором варианте ПосчитатьЭлемент(Элемент); вызывается всегда, а в первом только когда Ответ = Истина
Приведенные два варианта кода, - не являются идентичными ! Потому что во-втором варианте ПосчитатьЭлемент(Элемент); вызывается всегда, а в первом только когда Ответ = Истина
Ну если думать логически то 2-ой способ дольше так как в любом случае будет выполняться функция посчитатьЭлемент но это может занимать какие-то доли секунды и этим можно принебречь
(3)
Не понятно что делает эта функция.
Если внутри происходит выборка из базы, у вас обрабатывается это построчно.
Можно попробовать собрать все подходящие записи в таблицу значений и передать её в ПосчитатьЭлемент.
И обратно вернуть результат в виде таблицы результата.
Т.е получится не построчная, а групповая обработка данных.
ПосчитатьЭлемент(Элемент );
Не понятно что делает эта функция.
Если внутри происходит выборка из базы, у вас обрабатывается это построчно.
Можно попробовать собрать все подходящие записи в таблицу значений и передать её в ПосчитатьЭлемент.
И обратно вернуть результат в виде таблицы результата.
Т.е получится не построчная, а групповая обработка данных.
(2) Нет, это не так. Если первая часть выражения вернет ложь, то вторая выполняться не будет. Например:
В результате будет
Процедура КнопкаВыполнитьНажатие(Кнопка)
Сообщить("Начало");
н=0;
Пока н < 5 Цикл
Результат = (н = 3) И ПоказатьСообщение(н);
Сообщить("Результат цикла " + н + " = " + Результат);
н = н + 1;
КонецЦикла;
Сообщить("Конец");
КонецПроцедуры
Функция ПоказатьСообщение(НомерЦикла)
Сообщить("Выполняется цикл номер " + НомерЦикла);
Возврат Истина;
КонецФункции
ПоказатьВ результате будет
Начало
Результат цикла 0 = Нет
Результат цикла 1 = Нет
Результат цикла 2 = Нет
Выполняется цикл номер 3
Результат цикла 3 = Да
Результат цикла 4 = Нет
Конец
Результат цикла 0 = Нет
Результат цикла 1 = Нет
Результат цикла 2 = Нет
Выполняется цикл номер 3
Результат цикла 3 = Да
Результат цикла 4 = Нет
Конец
(57) открою секрет, в 1с есть инструменты для замера скорости выполнения кода, если вы проведете исследование и выложите здесь результаты всем будет интересно.
Только при сравнении скорости замените
на
для 1с всё таки есть разница в скорости исполнения кода записанного в одну или в несколько строк.
Только при сравнении скорости замените
Если Ответ Тогда
ПосчитатьЭлемент(Элемент )
КонецЕсли;
на
Если Ответ Тогда Результат=ПосчитатьЭлемент(Элемент) КонецЕсли;
для 1с всё таки есть разница в скорости исполнения кода записанного в одну или в несколько строк.
Нет никакой разницы! Интерпретатор переработает все равно, и итог этого будет одинаков, конструкция Результат = (А > 0) и Если А > 0 Тогда Результат = Истина Иначе Результат = Ложь КонецЕсли. разницы не будет, прирост (как уже сказали) будет только в интерпретации кода платформой (это как писать в одну строку), но это будет совсем незаметно. И кстати платформа не обрабатывает второе условие если не сработало первое, например:
Никогда не будет ошибки исключения если ТекущиеДанные = Неопределено, потому что второе условие после "И" никогда не проверяется, если первое не ИСТИНА
Если ТекущиеДанные <> Неопределено И ТекущиеДанные.Количество > 0 Тогда
....
КонецЕсли;
Никогда не будет ошибки исключения если ТекущиеДанные = Неопределено, потому что второе условие после "И" никогда не проверяется, если первое не ИСТИНА
Внимание! Тема сдана в архив
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот