Может ли v8 устранять мертвый код на основе значения const? - PullRequest
1 голос
/ 27 мая 2020

Вопрос к разработчикам / экспертам v8.

Правильно ли предположить, что v8 полностью устранит мертвый код, имеющий такую ​​структуру:

module1. js

export const DEBUG = false

module2. js

import { DEBUG } from './module1.js'

if (DEBUG) {
    // dead code eliminated?
}

Пожалуйста, без комментариев вроде - «накладные расходы на проверку 'if' очень малы, и вы должны XXX вместо того, чтобы задавать этот вопрос», я просто хочу чтобы узнать, может ли v8 на это (да / нет, желательно, конечно, с небольшими подробностями).

Спасибо!

1 Ответ

3 голосов
/ 27 мая 2020

Разработчик V8 здесь. Ответ, как это часто бывает, «зависит от обстоятельств».

Оптимизирующий компилятор V8 поддерживает удаление мертвого кода, так что да, при правильных обстоятельствах условная ветвь, которая никогда не может быть выполнена, будет удалена.

Тем не менее, в опубликованном вами примере c код верхнего уровня не будет оптимизирован (вероятно - зависит от того, что еще там есть), поэтому в этом случае нет, проверка if (DEBUG) будет скомпилирован (в неоптимизированный байт-код) и выполнен - ​​один раз, потому что выполнение его один раз происходит намного быстрее, чем первая попытка его оптимизации (и, возможно, устранения). ", т.е. по запросу. Это означает, что если у вас есть целая функция, которая никогда не вызывается (например, потому что ее единственный сайт вызова находится в if (DEBUG) -блоке, а DEBUG - false), то эта функция даже не будет скомпилирована в байт-код, в значительной степени менее оптимизированный код. Это не исключение мертвого кода в традиционном значении этого термина, но можно сказать, что это даже лучше: -)

В заключение: если ваше приложение набросано небольшим кодом DEBUG, это нормально оставить. Либо он будет в редко выполняемых путях, и в этом случае стоимость выполнения проверок не имеет значения; или он будет в горячих путях, и в этом случае V8 оптимизирует его и исключит условные выражения. Однако, если у вас есть лотов такого кода, то его удаление будет иметь два преимущества: размер загрузки и время анализа. Когда код JavaScript поступает в браузер, движку ничего не остается, кроме как взглянуть на каждый его байт хотя бы вкратце (хотя бы для того, чтобы выяснить, какие функции есть и какие части кода находятся на верхнем уровне). и должен выполняться немедленно), и чем меньше байтов, тем быстрее завершится этот шаг. Разбор выполняется быстро, но вдвое меньше - еще быстрее!

...