2014-12-17 3 views
0

Я хочу сохранить данные и получить быстрый доступ к ним. Все мои данные имеют уникальный идентификатор.Javascript объект против производительности массива

Я могу придумать две возможности.

объект:

myObject[id] = myDataObject; 

массив:

myArray.push(myDataObject); 

В случае массива идентификатора будет унаследованным внутри myDataObject. Если я хочу найти некоторые данные в соответствии с идентификатором, как мне это сделать. Что было бы самым быстрым?

Что бы быстрее уважая следующие ситуации:

  1. массив сортируется по ID в myDataObject каждый раз новый ID «выталкивается»
  2. поиска в массиве необходимых данных осуществляется своего рода алгоритм быстрой сортировки

Как справиться с этим объектом:

var someCrazyID = 1233AFE12B00ED; 
console.log(myObject[someCrazyID].attribute); 

Происходит ли он повторять весь объект, или он делает что-то симулятивное в фоновом режиме, как я бы сделал с массивом вручную?

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

Спасибо за помощь заранее

+0

Я думаю, что нет существенной разницы. js array основан на ключах/значениях. даже вы даете целое число как индекс, оно по-прежнему зависит от ключа/значения – Adem

+0

Вы можете сортировать массивы, и вы можете искать значения с помощью ключей в объектах. Производительность мудрая, вероятно, не имеет значения, что вы выбираете, если она подходит для данных и использования. – adeneo

+0

Ничего подобного [пытается] (http://jsperf.com/) – JNF

ответ

1

В зависимости от количества предметов, которые вы хотите сохранить. Если объектов не так много, то доступ к объекту вполне прав. Однако с увеличением количества массивов данных будет намного быстрее.

Давайте проверим его и проведем эксперимент.

Повторите доступ к объекту и массиву в течение 1 миллиона раз и измерьте время.

var obj = new Object(), 
    arr = []; 

// init 
// let's give our object 1 million properties and to array 1 million elements 
for (var i=0; i<1000000; i++) { 
    obj[i] = i; //instead of obj["prop"+(i)] 
    arr.push(i); 
}; 

// let's repeat access to object property 1 million times 
var d1 = (new Date()).getTime(); 

var x; 
for (var i=0; i<1000000; i++) { 
    x = obj[i]; //instead of obj["prop"+(i)] 
} 

var ms1 = (new Date()).getTime() - d1; 
alert("Access to object property took " + ms1 + "ms."); 

// now let's repeat access to array 1 million times 
var d2 = (new Date()).getTime(); 

var y; 
for (var i=0; i<1000000; i++) { 
    y = arr[i]; 
} 

var ms2 = (new Date()).getTime() - d2; 
alert("Access to array took " + ms2 + "ms."); 

Вот JSFiddle: http://jsfiddle.net/0d7qu0hd/1/

Результаты на моем ноутбуке, ясно:

Доступ члена объекта: 500мс в среднем

Доступ к массиву по индексу: 3ms в среднем

EDIT: Как Макс отметил - преобразование действительно требуется дополнительное время. Без преобразования результаты одинаковы.

EDIT 2: После выполнения нескольких тестов кажется, что доступ к объекту [i] немного быстрее, чем массив [i]. 2 мс против 3-4 мс.

+0

Hi ivan, спасибо за ваш ответ, но ваши результаты, вероятно, недействительны, потому что вы сделали конверсию («prop» + i), которая занимает все время в каждой итерации. –

+0

Вы верны. Макс. Конечно, я полностью забыл об обращении. Спасибо за это. –

2

В JavaScript объекты в основном являются хэш-картами, а это означает, что поиск определенного значения с учетом ключа - это постоянная операция стоимости O (1). Это делает объекты идеальными для функций, основанных на поиске, поэтому вы, вероятно, захотите пойти с объектами, поэтому сортировки не потребуется (конечно, объекты по определению представляют собой несортированную коллекцию их пар ключ-значение), и поиск будет быть быстрым независимо.

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

+0

Я понимаю, что вы говорите, но это не подходит к примеру ответа ivan.sivak - не могли бы вы объяснить, почему результаты в его примере отличаются от того, что вы заявляете? –

Смежные вопросы