Показать сообщение отдельно
  #1 (permalink)  
Старый 30.06.2013, 18:44
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Размеры функций
Привет всем. Надеюсь, не стоит спрашивать, зачем строить уровни абстракций и вообще дробить задачи на мелкие подзадачи.

у меня на повестке дня другой вопрос. Все мы знаем, что наш код (JavaScript'овый) сначала компилируется в медленный (относительно) байткод, который при определённой доле статичности компилируется в машинный код (как C++ )

Так вот, помните в спецификации были описаны процедуры, которые проводятся при вызове каждой функции? Если писать очень много функций, каждый вызов будет проводиться эта долгая операция по проверке, вообще функция ли смеет в коде вызываться, какие аргументы она берёт формально и фактически и т.д.

Логично же сказать то, что JavaScript'овые движки будут inline'ить функции? Конечно. Но не все.

Мой вопрос связан с тем, какие условия проверяются при том проверке того, можно ли заинлайнить вот эту (сферическую в вакууме функцию в любом вашем коде) функцию?

Среди срача отладочных сообщений V8 мне удалось вытащить некоторые (по любому не все же, верно?) условия, при которых inline'ить функцию нельзя ни в коем случае и следует замедлять её вызов с помощью "полосы препятствий", предложенных спецификацией.

Итак , функцию нельзя inline'ить, если :
  • Она проверяет arguments. Вообще, как можно заинлайнить то, что принимает переменное кол-во аргументов?
  • Она является встроенной. Сюда относятся и toNumber, NonStringToString из спецификации.
  • Она меняет контекст исполнения. Контекст - это this. Пример: функция-callback в setTimeout, setInterval.
  • Самое ужасное - в искомой функции слишком много кода.
(пишу по памяти, ибо уже сам давно не прикасался к коду на JS)

И вот последнее мне не даёт покоя. Сколько кода нужно иметь в функции? Каких объёмов они должны быть?

Последний раз редактировалось melky, 30.06.2013 в 18:55.
Ответить с цитированием