Начало » Использование СУБД » Firebird, HQbird, InterBase » coalesce() как реализована? (лишнего нам не надо)
coalesce() как реализована? [сообщение #3146] |
Wed, 20 September 2023 19:08  |
shalamyansky
Сообщений: 150 Зарегистрирован: August 2022
|
Senior Member |
|
|
coalesce( x, long_read() )
Можно представить 2 способа реализации, лобовой с предварительным вычислением аргументов
result = x;
y = long_read();
if( result is null ) then begin
result = y;
end
и оптимизированный без лишних действий
result = x;
if( result is null ) then begin
result = long_read();
end
Второй способ, ясен пень, требует от компилятора понимания, что он в случае coalesce() имеет дело не с обычной функцией, а по сути с некой особой языковой конструкцией. Но зато в некоторых случаях может существенно ускорить процесс исполнения, избежав никому не нужных вычислений.
Так как оно работает? Интересует прежде всего Firebird 4.0.
P.S.
Если же вычисления аргументов имеют еще и побочные эффекты, отличаться будет не только скорость, но и логика.
Предполагаю сам, что работает по первому варианту (с предварительными вычислениями). Но вдруг.
P.P.S.
Да, проверить экспериментально могу. Провоцирую на обсуждение. А как хотелось бы? А как правильно?
|
|
|
Переход к форуму:
Текущее время: Mon Feb 24 23:11:37 GMT+3 2025
Общее время, затраченное на создание страницы: 0.01099 секунд
|