Привет всем. Надеюсь, не стоит спрашивать, зачем строить уровни абстракций и вообще дробить задачи на мелкие подзадачи.
у меня на повестке дня другой вопрос. Все мы знаем, что наш код (JavaScript'овый) сначала компилируется в медленный (относительно) байткод, который при определённой доле статичности компилируется в машинный код (как C++
)
Так вот, помните в спецификации были описаны процедуры, которые проводятся при вызове каждой функции? Если писать очень много функций, каждый вызов будет проводиться эта долгая операция по проверке, вообще функция ли смеет в коде вызываться, какие аргументы она берёт формально и фактически и т.д.
Логично же сказать то, что JavaScript'овые движки будут inline'ить функции? Конечно. Но не все.
Мой вопрос связан с тем, какие условия проверяются при том проверке того, можно ли заинлайнить
вот эту (сферическую в вакууме функцию в любом вашем коде) функцию?
Среди срача отладочных сообщений V8 мне удалось вытащить
некоторые (по любому не все же, верно?) условия, при которых inline'ить функцию
нельзя ни в коем случае и следует замедлять её вызов с помощью "полосы препятствий", предложенных спецификацией.
Итак , функцию нельзя inline'ить, если :
- Она проверяет arguments. Вообще, как можно заинлайнить то, что принимает переменное кол-во аргументов?
- Она является встроенной. Сюда относятся и toNumber, NonStringToString из спецификации.
- Она меняет контекст исполнения. Контекст - это this. Пример: функция-callback в setTimeout, setInterval.
- Самое ужасное - в искомой функции слишком много кода.
(пишу по памяти, ибо уже сам давно не прикасался к коду на JS)
И вот последнее мне не даёт покоя. Сколько кода нужно иметь в функции? Каких объёмов они должны быть?