Производительность OOJS над функциональным программированием JavaScript - PullRequest
2 голосов
/ 10 января 2011

Этот вопрос относится к предыдущему вопросу здесь:

Сокращение количества обращений к методам объекта JavaScript

При профилировании этих двух фрагментов кода с помощью Firebug:

function ie6PNGFixLoader(scriptURL) {
    if(arguments.length > 0) {
        for (var i = 0; i < arguments.length; i++) {
            $.ajax({// load PNG fix scripts
                url: arguments[i],
                cache: true,
                dataType: 'script'
            });
        }
    } else {
        return false;
    }               
}

var pngFix = "/Global/ICIS/Scripts/DD_belatedPNG_0.0.8a-min.js";    
var pngList = "/Global/ICIS/Scripts/DD_PNG_listing.js"; 
ie6PNGFixLoader(pngFix, pngList);

и

function InjectScriptsAndExecute(url) {
    this.url = url;
}

InjectScriptsAndExecute.prototype.InjectMethod = function() {
    var inject = $.ajax({
                        url: this.url,
                        cache: true,
                        dataType: 'script',
                        async: false, // Otherwise you cannot depend on the parse order
                        }); 
    return inject;  
}
var pngFix = new InjectScriptsAndExecute("/Global/ICIS/Scripts/DD_belatedPNG_0.0.8a-min.js");
var pngList = new InjectScriptsAndExecute("/Global/ICIS/Scripts/DD_PNG_listing.js");
pngFix.InjectMethod();
pngList.InjectMethod();

Оказывается, что вызовы последнего методом InjectScriptsAndExecute выполняются намного быстрее, чем вызовы его функции. Коллега спросил меня, почему, когда я упомянул об улучшении производительности, но я не могу объяснить это сам.

Любой совет для лучшего понимания был бы с благодарностью принят.

1 Ответ

7 голосов
/ 10 января 2011

Аргументы не Array Object, которые в некоторой степени ведут себя как массив.

if(arguments.length > 0) { // Slow AND superfluous
    for (var i = 0; i < arguments.length; i++) { // Even SLOWER
        arguments[i]; // Holy...

Кэш длина, доступ к свойству медленный, IE6 вообще не будет иметь никакой оптимизации для .length, и я даже подозреваю, что он будет очень медленным при использовании arguments[i], так как он не настоящий Array и поэтому может выполнить поиск неоптимизированного свойства.

Если вы хотите получить лучшее из обоих миров, передайте нормальный Array, используйте простой цикл for и cache length.

function ie6PNGFixLoader(scripts) {
    for (var i = 0, l = scripts.length; i < l; i++) {
        $.ajax({// load PNG fix scripts
            url: scripts[i],
            cache: true,
            dataType: 'script'
        });
    }              
}

ie6PNGFixLoader(["/Global/ICIS/Scripts/DD_belatedPNG_0.0.8a-min.js",
                 "/Global/ICIS/Scripts/DD_PNG_listing.js"]);

EDIT

Чтобы было понятно, синхронизация цикла бесполезна, запрос асинхронный, все, что вы делаете, синхронизируете цикл и вызов $.ajax, здесь нет смысла оптимизировать, особенно для two записей. Даже в IE6 выполнение самого вызова Ajax (даже просто вызов $.ajax) будет намного медленнее, чем цикл.

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