Цикл по объекту JavaScript - какой из них быстрее? - PullRequest
0 голосов
/ 24 марта 2012

между сохранением имени ключа, подобного этому

    for(var key in this.data)
        {
            var key_name = key;
            for(key in this.data[key_name].content){
                alert(this.data[key_name].content[key].score);
            }
        }

или созданием объектов контрольных точек для каждого родительского узла

    for(var key in this.data)
        {
            var obj = this.data[key];
            for(key in obj.content){
                var  inner_obj = obj.content;
                alert(inner_obj[key].score);
            }
        }

какой из них имеет более высокую производительность?любое другое предложение?

Ответы [ 4 ]

5 голосов
/ 24 марта 2012

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

http://jsperf.com/so-question-9853395

enter image description here

(нажмите для получения последних результатов)

4 голосов
/ 24 марта 2012

Вы должны использовать комбинацию из двух:

for(var key in this.data)
    {
        var inner_obj = this.data[key].content;
        for(ikey in inner_obj){
            alert(inner_obj[ikey].score);
        }
    }

Это будет самый быстрый способ сделать это по сравнению с двумя предложенными вами решениями.

Обратите внимание, что я переименовал key до ikey во внутреннем цикле, чтобы избежать путаницы.

После проверки мое решение действительно является самым быстрым: Подтверждение скорости http://i.minus.com/ibqGL9wNRtcN3i.jpg

1 голос
/ 24 марта 2012

Теоретически, по крайней мере, быстрее всего было бы получить ссылку на объект вне внутреннего цикла.На практике разница может быть не такой большой, если браузер уже делает это внутренне.Кроме того, производительность может отличаться в разных браузерах.

for(var key in this.data) {
  var obj = this.data[key].content;
  for(var key2 in obj){
    alert(obj[key2].score);
  }
}

Обратите внимание, что вы должны использовать отдельные переменные для циклов, иначе будет трудно проследить, какие значения находятся в переменной, в какой момент, когда вы помещаете некоторые фактическиекод в циклах.

Редактировать:

Когда я измеряю производительность в IE и Firefox, я считаю, что этот метод немного быстрее, чем методы, предложенные в вопросе,Однако разница настолько мала, что вам не следует об этом беспокоиться.Любой из методов работает просто отлично, и любые проблемы с производительностью будут связаны с тем, что вы на самом деле делаете со значениями во внутреннем цикле.

0 голосов
/ 24 марта 2012

С точки зрения интерпретатора кода, первый должен быть быстрее. Во втором примере в каждом цикле вы должны получить доступ к массиву this.data.

В современных браузерах у вас может быть хороший компилятор Just In Time. Если это правда, этот JIT может «перевести» ваш код в точно такой же код операции.

Таким образом, вы должны тестировать в разных браузерах, выполняя ваш код несколько раз (я имею в виду несколько тысяч раз) и измеряя время выполнения.

Если у вас нет JIT-компилятора в вашем браузере, фолдинг будет еще быстрее.

var data = this.data
for(var keyA in data)
    {
        var content = data[keyA].content;
        for(keyB in content){
            alert(content[keyB].score);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...