В последнее время я проделал большую работу в Node JS, и его акцент в асинхронных модулях заставляет меня полагаться на применение функции привязки к замыканиям для обертывания асинхронных вызовов внутри циклов (для сохранения значений переменных при вызове функции).
Это заставило меня задуматься. Когда вы связываете переменные с функцией, вы добавляете переданные значения в локальную область действия этой функции. Таким образом, в Node (или любом коде JS, который часто ссылается на переменные области видимости), выгодно ли привязывать переменные области видимости (например, модули) к функциям, чтобы при использовании они являлись частью локальной области видимости?
Пример в простом JS:
var a = 1,
func1 = function(b) { console.log(a,b); },
func2 = (function(a,b) { console.log(a,b); }).bind(null, a);
//func1(2) vs func2(2)
Пример в узле
var fs = require('fs'),
func1 = function(f) { fs.stat(f, function(err, stats){}); },
func2 = (function(fs, f) { fs.stat(f, function(err, stats){}); }).bind(null, fs);
//func1('file.txt') vs func2('file.txt')
В моих приведенных выше примерах func1 или func2 будут заметно быстрее других (не включая внешние факторы, такие как время, необходимое для получения статистики файла)?
Вот небольшой JSFiddle, который я собрал, который делает быстрый и грязный тест: http://jsfiddle.net/AExvz/
- Google Chrome 14.0.797.0 dev-m
- Func1: 2-4ms
- Func2: 30-46мс
- Google Chrome 14.0.800.0 канарейка
- Func1: 2-7ms
- Func2: 35-39мс
- Firefox 5.0
- Func1: 0-1ms
- Func2: 35-42мс
- Opera 11.11 Build 2109
- Func1: 21-32мс
- Func2: 68-73мс
- Safari 5.05 (7533.21.1)
- Func1: 23-34мс
- Func2: 71-78мс
- Internet Explorer 9.0.8112.16421
- Func1: 10-17ms
- Func2: 14-17мс
- Узел 0.4.8 REPL
- Func1: 10 мс
- Func2: 156 мс при 10-кратном увеличении числа итераций (~ 15,6 мс при тестировании с 100000 итерациями)
Примечание: Тест узла REPL ненадежен, поскольку он должен использовать какую-то систему кеширования. После одного теста func1 func2 вернул 0 мс.
Не стесняйтесь представить свои результаты лучшего теста.