Ссылка-Подсветка дополнение


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

var highlightLinks = function(e)
{
  var anchors = e.target.getElementsByTagName("a");
  let file = Components.classes["@mozilla.org/file/directory_service;1"]
                  .getService(Components.interfaces.nsIProperties)
                  .get("ProfD", Components.interfaces.nsIFile);
  file.append("test.sqlite");

  var storageService = Components.classes["@mozilla.org/storage/service;1"]
          .getService(Components.interfaces.mozIStorageService);
  var conn = storageService.openDatabase(file);

  var statement = conn.createStatement("select * from links where url=?1");
  for (var i = 0; i < anchors.length; i++) {
    statement.bindStringParameter(0, anchors[i].href);
    statement.executeAsync({
      anchorIndex: i,
      handleResult: function(aResultSet) {
        for (let row = aResultSet.getNextRow();
             row;
             row = aResultSet.getNextRow()) {

          let value = row.getResultByName("url");
          if (value == anchors[this.anchorIndex]) { 
           anchors[this.anchorIndex].innerHTML += "+";
          }
        }
      },

      handleError: function(aError) { 
        print("Error: " + aError.message);
      },

      handleCompletion: function(aReason) {
        if (aReason != Components.interfaces.mozIStorageStatementCallback.REASON_FINISHED)
          print("Query canceled or aborted!");
      }
    });
  }
  statement.finalize();
  conn.close();
}

window.addEventListener("DOMContentLoaded", highlightLinks, false);


Комментарии
1 ответ

Я верю, что вы могли бы улучшить ваш код с помощью прототипов такой:

function handler(anchorIndex, anchor) {
this.anchorIndex = anchorIndex;
this.anchor = anchor;
}

handler.prototype = {
handleResult: function(aResultSet) {
for (let row = aResultSet.getNextRow();
row;
row = aResultSet.getNextRow()) {

let value = row.getResultByName("url");
if (value == anchor) {
anchor.innerHTML += "+";
}
}
},

handleError: function(aError) {
print("Error: " + aError.message);
},

handleCompletion: function(aReason) {
if (aReason != Components.interfaces.mozIStorageStatementCallback.REASON_FINISHED) {
print("Query canceled or aborted!");
}
}
};

Вместо создания нового объекта, который имеет для создания новых экземпляров одной и той же функции, вы создаете после того, как эти функции. Это позволит повысить производительность и уменьшить использование памяти на борту проверяется с помощью http://jsperf.com/new-function-vs-object

Ваш цикл будет резко снижена, чтобы посмотреть, как

for (var i = 0; i < anchors.length; i++) {
statement.bindStringParameter(0, anchors[i].href);
statement.executeAsync(new handler(i, anchors[i]));
}

Редактировать:
Вы найдете этот способ создания новых экземпляров объектов быстрее в IE7-9 в ~3 раза, а примерно в 2 раза быстрее в FF5. Мой Дев хром показывает странные результаты в том, что оригинальный метод 20% так же быстро, как IE, но показывает ~улучшение 155x (10 раз быстрее, чем все другие браузеры) при использовании прототипа способ.

6
ответ дан 1 августа 2011 в 02:08 Источник Поделиться