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

Сообщение от Дзен-трансгуманист Посмотреть сообщение
А можно поподробнее, что конкретно замедляло исполнение кода и на каких движках? (мне особенно интересно, если это относится к V8)
замедляли врапперы вызовов... сейчас покажу примерчик (git всё помнит, хехе)
+    /**

+     * Просто вызовет функцию с аргументами

+     * @param {Function} func функция

+     * @param {Array=} args массив аргументов

+     * @param {Object=} ctx контекст

+     * @return {*}

+     */

+    function apply (func, args, ctx) {

+        return type.function(func) && func.apply(ctx, args);

+    }

+

+    /**

+     * Вернёт функцию, которая применит список функций,

+     * до тех пор, пока они будут возвращать истинное значение

+     * при переданных аргументах

+     *

+     * альтернатива : f(x) && g(x) && ...

+     *

+     * @param {...Function} functions список функций

+     * @return {Function}

+     */

+    function and (functions) {

+

+        functions = slice(arguments);

+

+        return function (/* args */) {

+            var args = arguments;

+            return each(functions, function (func) { return toBool(apply(func, args)); });

+        };

+    }

+

+    /**

+     * Частичное применение функции

+     * Аргументы можно пропускать, передав

+     * специальное значение "_"; при запуске

+     * пропущенные аргументы заполнятся

+     * слева направо.

+     *

+     * @param {Function} fn функция

+     * @param {Array} args аргументы

+     * @param {Object=} ctx контекст исполнения функции

+     * @return {Function} частично применённая функция

+     *

+     * @example

+     * var line = function (k, x, b) { return k * x + b; };

+     * var id = partial(line, [ 1, _, 0 ]);

+     * id(0);   // 0

+     * id(2);   // 2

+     * id(777); // 777

+     */

+    function partial (fn, args, ctx) {

+

+        function isHole (x) { return x === partial.hole; }

+

+        return function () {

+

+            var fresh = new Iterator(arguments);

+            fresh.none = partial.defaultValue;

+

+            function filter (arg) { return isHole(arg) ? fresh.next():arg; }

+

+            return apply(fn, map(args, filter).concat(slice(fresh.collection, fresh.index)), ctx);

+        };

+    }

+

+    /**

+     * Вернёт функцию, которая передаст первой функции только

+     * указанное количество аргументов

+     * @param {Function} fn

+     * @param {number} num

+     * @return {Function}

+     */

+    function aritilize (fn, num) {

+        return function() {

+            return fn.apply(this, slice(arguments, 0, num));

+        }

+    }

+

+    /**

+     * Обратит порядок аргументов у функции

+     * @param {Function} fn

+     * @param {Object=} ctx Контекст исполнения

+     * @return {Function}

+     */

+    function reverse (fn, ctx) {

+        return function () {

+            apply(fn, slice(arguments).reverse(), ctx);

+        };

+    }

+

+    /**

+     * Аналог bind из ES5. Формат

+     * аргументов, как в partial

+     * @inheritDoc

+     * @see partial

+     */

+    function bind (fn, ctx, args) { return partial(fn, args || [], ctx); }

+

+    /**

+     * Значение для любого аргумента по-умолчанию

+     * @type {undefined}

+     * @private

+     */

+    partial.defaultValue = undefined;

+

+    /**

+     * Специальное значение "дырка", указывающее на то,

+     * что аргумент пропущен

+     * @type {Object}

+     * @private

+     * @see partial

+     */

+    var _ = partial.hole = {};

+

+    /**

+     * Вернёт функцию, которая последовательно

+     * применит список функций к аргуметам

+     *

+     * Альтернатива: f(g(x))

+     *

+     * @param {...Function} functions список функций

+     * @return {Function}

+     */

+    function compose (functions) {

+

+        functions = slice(arguments);

+

+        return function (/* args */) {

+            var args = slice(arguments);

+            each(functions, function (func) { args = [ apply(func, args) ]; });

+            return args;

+        };

     }


с помощью них можно было писать красивый декларативный код... но в профилировщике на первом месте висел не код приложения, а код этих врапперов.

код написал на вдохновении после прочтения книжки о лямбда-исчислении

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

З.Ы.
Небольшая заметка для новичков. Нельзя всё программирование свести к борьбе за скорость, скорость критична в компьютерных играх или рендерах каких либо графических приложений. Но в подавляющем числе задач скорость имеет значительно меньшее значение, и бороться за миллисекунды нет ни какого смысла. К примеру обсолютно пофиг с какой скоростью готовится отчёт по деятельности предприятия, лишние 100 или 200 мс погоды не делают. Здесь более важно то насколько этот отчёт можно удобно менять вслед за тем как изменяется бизнес. То есть критерии оценки качества продукта совершенно иные.
согласен полностью.. жаль, что в текущем скрипте она действительно важна, и от скорости его зависит многое.
Ответить с цитированием