Может ли привязка переменных за пределами области видимости ускорить ваш код?

В последнее время я много работал с 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/

  1. Google Chrome 14.0.797.0 dev-m
    • Func1: 2-4ms
    • Func2: 30–46 мс
  2. Google Chrome 14.0.800.0, канарейка
    • Func1: 2–7 мс
    • Func2: 35–39 мс
  3. Firefox 5.0
    • Func1: 0–1 мс
    • Func2: 35–42 мс
  4. Opera 11.11 Build 2109
    • Func1: 21–32 мс
    • Func2: 68–73 мс
  5. Safari 5.05 (7533.21.1)
    • Func1: 23–34 мс
    • Func2: 71–78 мс
  6. Internet Explorer 9.0.8112.16421
    • Func1: 10-17 мс
    • Func2: 14-17 мс
  7. Узел 0.4.8 REPL
    • Func1: 10 мс
    • Fu nc2:156 мс при 10-кратном увеличении итераций (~ 15,6 мс, если оба тестировались на 100000 итераций)

Примечание: Тест REPL узла ненадежен, потому что он должен использовать какую-то систему кэширования. После единственного теста func1, func2 вернул 0 мс.

Не стесняйтесь поделиться своими результатами более качественного теста.

5
задан Bailey Parker 22 June 2011 в 18:13
поделиться