2016-07-12 4 views
0

Мне было любопытно видеть разницу в скорости между массивами и объектами, поэтому я настроил тест для заполнения, доступа и удаления 100 000 элементов из массива и объекта. Доступ и заполнение массива были примерно равны с разницей ~ 3 мс. Однако удаление из массива привело к 604ms разница (10 мс против 614 мс). Почему это? Я думал, что объекты и массивы практически одинаковы.Почему удаляется объект быстрее, чем сплайсинг?

Demo: https://codecanister.com/Project/b9f8de7c/1/result/

+1

Функциональные вызовы стоят дорого! Существует большая разница между использованием ключевого слова 'delete' и' .splice'. – undefined

+0

Вы не должны использовать дату для измерения времени. Вместо этого используйте 'performance.now();'. – Mick

+0

Обновлено, но разница около 600 мс. – jlynch630

ответ

2

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

Так что рассмотрите массив [1, 2, 3, 4]. Значение свойства «0» равно 1. Если вы соедините эту запись, тогда время выполнения должно установить свойство «0» на 2, свойство «1» - 3, а свойство «2» - 4.

0

Вы просто выполняете различные действия. «delete» просто установит неопределенное значение позиции массива. Хотя сплайсинг полностью удалит его, выполнив цикл с arr [i] = arr [i + 1] для всех 10000 элементов вашего массива. Вы делаете это для всех 10.000 предметов. См. Также this question

+0

«Насколько я вижу ваш объект« obj »- это массив,« --- это? – zerkms

+1

"" delete "просто установит неопределенное значение массива" --- это не так, оно создает отверстие в массиве. – zerkms

+0

Это другое, что просто установка неопределенного, потому что позиция игнорируется функцией foreach и map. – bormat

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