Почему jQuery inArray слишком медленный? - PullRequest
3 голосов
/ 14 января 2012

Я запустил некоторые тесты , и данные указывают, что jQuery inArray() намного медленнее, чем простой цикл.

И array.indexOf() даже не на тестах, потому что ранее я проводил другие тесты, и он работал еще хуже.

  • Почему это намного медленнее?
  • Почему они не используют простые циклы?
  • Есть ли что-то, что я наблюдаю?

Должна быть веская причина не использовать это:

for(var i=0,len=arr.length,rtn=-1;i<len;i++){
    if(arr[i]==="arritem"){
        rtn=i;
        break;
    }
}

Ответы [ 2 ]

5 голосов
/ 14 января 2012

Если вы собираетесь тестировать jQuery inArray, на самом деле тестируйте jQuery inArray и сравнивайте яблоки с яблоками (вызывая функцию и вызывая функцию - вы можете написать встроенный цикл в местах, где производительность равна чрезвычайно критически, но это не будет ваш ход по умолчанию, предположительно): http://jsperf.com/inarraytest/3

Подготовка HTML:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script>

Код подготовки:

var arr=[0,1,2,3,4,5,6,7,8,9];

function arrayLoop(elem, array, i) {
    var len = array.length;
    i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
    for ( ; i < len; i++ ) {
        // Skip accessing in sparse arrays
        if ( i in array && array[ i ] === elem ) {
            return i;
        }
    }
    return -1;
}

Тесты:

// jQuery.inArray last
var rtn=jQuery.inArray(9,arr);

// arrayLoop last
var rtn = arrayLoop(9,arr);

// jQuery.inArray middle
var rtn=jQuery.inArray(4,arr);

// arrayLoop middle
var rtn = arrayLoop(4,arr);

// jQuery.inArray first
var rtn=jQuery.inArray(0,arr);

// arrayLoop first
var rtn = arrayLoop(0,arr);

Результаты в Chrome (с indexOf) заключаются в том, что jQuery.inArray всегда быстрее, чем arrayLoop (в первой паре тестовых случаев, где мы ищем последнюю запись, резко так).

Результаты для IE6 (у которого нет indexOf): jQuery.inArray всегда быстрее, чем arrayLoop, хотя неудивительно, что не так много (поскольку он должен выполнять по существу ту же самую работу) & mdash; за исключением, что любопытно, в случае, когда мы ищем первую запись в массиве, в этом случае это намного быстрее.

3 голосов
/ 14 января 2012

То, что вы делаете, является лишь частью того же кода jQuery $ .inArray, и, конечно, это будет быстрее, если вы возьмете фрагмент кода и протестируете только эту функциональность.Проверьте все условия, которые проверены перед тем, как он фактически перебирает список, чтобы найти элемент.

Это дополнительное время между простым циклом и $ .inArray ().

Наконец: вы можете придерживаться простого цикла, если точно знаете следующее:

  1. Ввод всегда является массивом
  2. Возможность отправки начального индекса вускорить поиск.
  3. Использование встроенной функции браузера indexOf.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...