2016-08-05 5 views
2

Что лучше для производительности - есть функция поиска, которая находит объект в массиве с определенным идентификатором или просто используется для цикла с отверстиями в массиве?Функция поиска или для цикла?

В моей ситуации у меня есть массив игроков, который является динамическим. Скажем, 3-х игроки соединены таким образом мой массив будет выглядеть следующим образом:

players = [player1, player2, player3] 

Было бы легко держать ключ массива в качестве игрока ID, так что я знал бы, что игрок с ID 2 является третьим в игроках массива и для того, чтобы доступ к ним, я просто нужно использовать: players[2], но как второй игрок уходит, он создает отверстие массива:

players = [player1,,player3] 

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

Спасибо!

+1

Для массива из 2 (или 200 или 2000) элементов это не имеет большого значения. – zerkms

+3

Почему бы не использовать объекты javascript {}, где ключи свойств являются идентификаторами игрока –

+8

«Программисты тратят огромное количество времени на размышления о скорости некритических частей своих программ или беспокоиться о них, и эти попытки эффективности действительно имеют сильный отрицательный результат влияние на отладку и обслуживание. Мы должны забыть о небольшой эффективности, скажем, около 97% времени: преждевременная оптимизация - это корень всего зла, но мы не должны упускать наши возможности в этих критических 3% »Дональд Кнут –

ответ

1

На мой взгляд вариант упоминается @Jaromanda X в комментариях является лучшим, потому что «осуществление дыры» станет медленнее и медленнее, особенно когда итерация массива игроков, потому что когда вы держите добавление и удаление игроки стрелы растут и становятся очень скудными, состоящими в основном из дыр.

var players = {}; 
players[p.id] = p; // add player p 
delete players[p.id]; // remove player p 
// player ids have to be unique and should be strings 

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

// ATTENTION: example of FAILING implementation 
var players = []; 
var map = {}; 
// add player p 
var idx = players.push(p) - 1; 
map[p.id] = idx; 
// remove player p 
players.splice(map[p.id], 1); 
delete map[p.id]; 
+0

Утечка памяти? Как это? – Bergi

+0

Если он продолжает добавлять и удалять игроков, массив продолжает расти, становясь очень редким. – maraca

+1

Это не утечка памяти (так же, как «window.foo =« bar »;' не является утечкой памяти). У вас не может быть утечка памяти в JS (если в реализации нет ошибки). То, что вы называете, - это просто неэффективное использование памяти. – zerkms

0

Использование

var players = { 
    abc1: player1, 
    abc2: player2, 
    abc3: player3 
} 

Вместо var players = [player1, player2, player3]

Теперь вы можете получить доступ к нему через players.abc1.name = "Nicholas" нет функции поиска требуется. Если вы только с помощью идентификаторов для просмотра каждого игрока в организованном порядке, я бы рекомендовал еще более простой подход:

var players = { 
    player1: player1, 
    player2: player2, 
    player3: player3 
} 

Таким образом, вы можете получить доступ к еще проще, как players.player1[madeUpPropName] = someValue;

Кроме того, вы никогда не должны зацикливаться на массиве. Используйте forEach или базовый цикл. Why is using "for...in" with array iteration a bad idea?

0

Вы можете легко проверить производительность самостоятельно, используя console.time(str) и console.timeEnd(str). Проверьте это с помощью следующих примеров:

var array = ['player1', 'player2', 'player3']; 

// Test using indexOf 
console.time('test1'); 
var val = array.indexOf('player3'); 
console.timeEnd('test1'); 

// Test using a for loop 
console.time('test2'); 
for (var i in array) { 
    if (i == 'player3') { 
     break; 
    } 
} 
console.timeEnd('test2'); 

Обратите внимание, как строка в time и timeEnd матча.

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