Использование метода Array.push

Подскажите пожалуйста, как быстрее вывести значение в массив?

Я написал простой тест для сравнения push а также a[a.length]= методы:

push.js:

self.onmessage = function (event) {
  var n = Number(event.data),
      i,
      pushAr = [],
      pushStart,
      pushDuration,
      ar = [],
      start,
      duration,
      message;

  // Push
  pushStart = new Date();
  for (i = 0; i < n; i += 1) {
    pushAr.push(i);
  }
  pushDuration = new Date() - pushStart;

  // explicit
  start = new Date();
  for (i = 0; i < n; i += 1) {
    ar[ar.length] = i;
  }
  duration = new Date() - start;

  message = "N = " + n;
  message += "\nPush duration: " + pushDuration + "; ";
  message += "Length duration: " + duration;

  self.postMessage(message);
};

main.js:

var worker = new Worker("push.js"),
    i;

worker.onmessage = function (event) {
  console.log(event.data);
};

for (i = 4; i < 8; i += 1) {
  worker.postMessage(Math.pow(10, i));
}

И я получил следующие результаты:

Хром:

N = 10000
Push duration: 0; Length duration: 0
N = 100000
Push duration: 3; Length duration: 5
N = 1000000
Push duration: 56; Length duration: 90
N = 10000000
Push duration: 807; Length duration: 948

Сафари:

N = 10000
Push duration: 1; Length duration: 4
N = 100000
Push duration: 2; Length duration: 2
N = 1000000
Push duration: 27; Length duration: 41
N = 10000000
Push duration: 283; Length duration: 461

Fire Fox:

N = 10000
Push duration: 1; Length duration: 0
N = 100000
Push duration: 2; Length duration: 2
N = 1000000
Push duration: 11; Length duration: 20
N = 10000000
Push duration: 279; Length duration: 412

Похоже на Array.push быстрее, но почему некоторые библиотеки используют array length вместо? А какие бонусы у такого метода? Почему Chrome такой медленный? Может быть, существуют более быстрые методы?

2 ответа

Решение

Оба метода одинаковы, push выполняется быстрее, потому что один и тот же алгоритм (получение длины массива) работает внутри механизма сценария, а не в сценарии. ar [ar.length] может использоваться, если вам нужно, чтобы результат этого выражения был новым значением, как в цепочечном назначении somevar = ar[ar.length] = "some new value"

Я нашел другое возможное использование - совместимость со старыми версиями движка javascript. В документации Microsoft для JScript версии 5.0 нет упоминания о методе push в объекте Array. И я на самом деле нашел свой собственный код тогда (около 2000), который на самом деле использует images[images.length] = s код. Так что, возможно, у массивов не всегда есть метод push.

PS Да, документация MSDN для push-метода говорит, что требуется версия 5.5, чего не было даже в Windows 2000.

Некоторые библиотеки (например, jQuery) используют ar[ar.length] потому что они не используют реальные массивы, но ArrayObjects, которые не имеют .push метод, потому что они являются объектами, а не массивами. Другой прием, который используется для решения этой проблемы и с которым вы часто сталкиваетесь, заключается в

Array.prototype.push.call(arrObj,'newValue');

Другая причина использования ar[ar.length] упоминается в Panda-34: цепные задания..!

Другие вопросы по тегам