Может ли v8 устранять мертвый код на основе значения `const`?
Вопрос к v8 разработчикам / знатокам.
Правильно ли предположить, что v8 полностью удалит мертвый код, имеющий такую структуру:
module1.js
export const DEBUG = false
module2.js
import { DEBUG } from './module1.js'
if (DEBUG) {
// dead code eliminated?
}
Пожалуйста, без комментариев вроде - "накладные расходы на проверку 'if' очень малы, и вам следует XXX вместо того, чтобы задавать этот вопрос", я просто хочу знать, способна ли v8 на это (да / нет, желательно с небольшими подробностями, конечно).
Спасибо!
1 ответ
Разработчик V8 здесь. Ответ, как это часто бывает, "зависит от обстоятельств".
Оптимизирующий компилятор V8 поддерживает удаление мертвого кода, так что да, при определенных обстоятельствах условная ветвь, которая никогда не может быть выполнена, будет удалена.
Тем не менее, в конкретном примере, который вы опубликовали, код верхнего уровня не будет оптимизирован (вероятно - зависит от того, что еще там есть), поэтому в этом случае нет, if (DEBUG)
check будет скомпилирован (в неоптимизированный байт-код) и выполнен - один раз, потому что выполнение его один раз намного быстрее, чем первая попытка его оптимизировать (и, возможно, устранить).
Также следует учитывать, что V8 компилирует функции "лениво", то есть по запросу. Это означает, что если у вас есть целая функция, которая никогда не вызывается (например, потому что ее единственный сайт вызова находится вif (DEBUG)
-блок и DEBUG
является false
), то эта функция даже не будет скомпилирована в байт-код, а тем более в оптимизированный код. Это не устранение мертвого кода в традиционном понимании этого термина, но можно сказать, что это даже лучше:-)
В заключение: если у вас есть немного DEBUG
-код, пропитанный вашим приложением, вполне нормально оставить его. Либо он будет в редко выполняемых путях, и в этом случае стоимость выполнения проверок не имеет значения; или он будет в горячих путях, и в этом случае V8 оптимизирует его и исключит условные выражения. Однако, если у вас много такого кода, его удаление будет иметь два преимущества: размер загрузки и время анализа. Когда код JavaScript поступает в браузер, движку ничего не остается, кроме как взглянуть на каждый его байт хотя бы вкратце (хотя бы для того, чтобы выяснить, какие функции есть, а какие части кода находятся на верхнем уровне и должны выполняется немедленно), и чем меньше байтов, тем быстрее завершается этот шаг. Парсинг выполняется быстро, но вдвое меньше - еще быстрее!