Внутренние функции JavaScript и производительность - PullRequest
5 голосов
/ 25 июня 2011

Как влияет на время выполнения и объем памяти определение функции клозера и глобальной области видимости?

function a(){
      //functions (option A)
}
//functions(option B)

Я понимаю, что у Варианта A есть преимущество function-a-scope (Закрытие) ...

Допустим, у меня есть 1000 функций, как это повлияет на время работы и память?

Ответы [ 2 ]

4 голосов
/ 25 июня 2011

Производительность

Очень крошечный эталонный кейс:

# 1 внутренняя функция: http://jsfiddle.net/bMHgc/

# 2 функция снаружи: http://jsfiddle.net/sAVZn/

На моей машине: (5000 * 1000 раз)

# 1 - 700 мс

# 2 - 80 мс

Память

Они почти одинаковые ...

Я бы порекомендовал вариант А, если это возможно, поскольку он может сделать ваш код чище.

4 голосов
/ 25 июня 2011

Если вы используете внутренние функции, среда выполнения должна распределять и сохранять их контексты для любого будущего вызова, и это происходит каждый раз, когда вызывается содержащая их функция. В результате удобно представить, что объявление внутренней функции работает как конструирование объекта, членами которого являются просто переменные во внешней области вокруг этой функции.

Это может быть не так уж и плохо, если вы делаете это нечасто, поскольку объем памяти примерно такой же, как при выделении объекта в куче; (и есть некоторые умные оптимизации, которые вы можете сделать, чтобы избежать этого в некоторых случаях, например, если вы только передаете функцию вниз по стеку вызовов, который вы можете выделить в пространстве локального стека, или делаете некоторые вставки и т. д.). Однако в большинстве случаев это все еще распределение, поэтому вам следует избегать использования слишком большого количества из них в занятых циклах или создания многих внутренних функций.

Так что, чтобы ответить на ваш вопрос, вариант B будет быстрее в целом. Но пусть это вас не обескураживает!

Мой последний вывод заключается в том, что удобные внутренние функции полностью перевешивают небольшие накладные расходы времени выполнения, и я бы сказал, что используйте их везде, где это удобно. Если это оказывается узким местом в производительности, вернитесь и оптимизируйте их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...