Решение, какая структура данных использовать во время разработки программного обеспечения может быть сложным. Этот блог стремится помочь вам принять решение, когда дело доходит до встроенных структур данных в JavaScript, объекты и массивы . Их производительность будет проанализирована путем внимательного взгляда на то, как распространенные взаимодействия, такие как доступ к данным, вставка, удаление и поиск с каждым из них.
Оглавление
- Предварительные условия
- Цели
- Объекты
- Доступ к данным, вставка и удаление
- Поиск в объектах
- Объектные методы
- Массивы
- Доступ к данным
- Поиск в массивах
- Вставка и удаление данных
- Методы массива
- Вывод
Предварительные условия
- Основное знание JavaScript
- Теоретическое знание Большой О записка (6 минут читается)
Цели
- Поймите, как объекты и массивы работают через призму Big O обозначения.
- Объясните, почему добавление элементов в начало массива является дорогой операцией с уважением к пространству и времени.
- Сравните и сопоставьте время выполнения для массивов и объектов, а также их встроенные методы.
Объекты
Объекты в JavaScript являются неупопорящимися структурами данных пар пар клавишных. Это означает, что нет начала или конца объекта. Когда данные добавляются в объект, данные помещаются в любом месте в нем.
const person = { name: 'Kwame', age: 30, height: 182, hobbies: ['reading', 'drawing', 'running'] }
Объекты наиболее ценны, когда порядок не требуется, но быстрый доступ к данным, вставка и удаление имеют приоритет.
Доступ к данным, вставка и удаление
Через призму Big O обозначения, Доступ к данным который включает в себя получение или изменение данных, хранящихся в объекте, выполняется в постоянное время O (1)
Анкет Это также верно для Вставка а также удаление данных.
- Вставка – O (1)
- Удаление – O (1)
- доступ – O (1)
Поиск в объектах
Поиск в объектах, с другой стороны, является линейным временем O (n)
Анкет Поиск здесь не относится к поиску ключа, подобного возраст В нашем примере объекта выше. Это относится к проверке всех значений объекта, чтобы увидеть, существует ли предоставленный поисковый запрос. Например, проверка, чтобы увидеть, если какой -нибудь из человек Значения объекта включают слово бежать .
Объектные методы
Доступ к всем ключам объекта через Object.keys ()
это O (n)
Поскольку это время выполнения прямо пропорционально количеству ключей, которые есть у объекта. То же самое относится и к экземпляру доступа к значениям объекта с Object.values ()
Анкет Технически больше работы, но его обозначения могут быть аппроксимированы с O (n)
Анкет Получение всех записей объекта с Object.Entries ()
Технически включает в себя гораздо больше вычислений, чем доступ к ключам и значениям, потому что он должен составлять клавиши и значения в массиве. Однако его сложность может быть собрана до O (n)
Анкет Наконец, в проверке, чтобы увидеть, имеет ли объект свойство или нет с встроенным методом HasownProperty ()
Постоянное время O (1)
Анкет Это потому, что он просто проверяет наличие собственности и возвращает логическое.
- Object.keys – O (n)
- Object.creules – O (n)
- Object.Entries – O (n)
- HasownProperty – O (1)
Массивы
Из коробки массивы заказаны списки. Каждому элементу в массиве присваивается индекс (числовое значение, которое соответствует месту хранения элементов в памяти). Заказанная особенность массивов составляет стоимость оптимизации производительности, поэтому важно использовать массивы, когда важен порядок данных, которые вы храните в них.
Доступ к данным
Операции, которые включают доступ (получение или обновление данных), являются быстрыми, они имеют большой O постоянного времени O (1)
Анкет Это является результатом индексации массивов. Доступ к элементу в массиве с индексом 0 требует того же времени, чтобы получить доступ к элементу с индексом 1000.
Поиск в массивах
Поиск, с другой стороны, является линейным O (n)
Анкет Если бы я хотел выяснить, является ли апельсин элементом массива фруктов, мне придется проверить потенциально каждый элемент. Следовательно, время, которое мне потребует, чтобы это было прямо пропорционально количеству элементов в массиве. Тем не менее, вы можете достичь большого O O (log (n))
При поиске через массив. Чтобы достичь этого, должны произойти две вещи. Первое условие заключается в том, что массив должен быть отсортирован. Во -вторых, вам придется использовать бинарный алгоритм в поиске через отсортированный массив Анкет Это связано с тем, что при использовании бинарного алгоритма поиска количество вещей, которые нужно искать, сокращается вдвое в каждой итерации, пока не найдет элемент, который вы ищете. Несортированные массивы, с другой стороны, можно искать только с помощью линейного метода поиска, поэтому сохранят время выполнения O (n)
также известен как линейное время.
Вставка и удаление данных
Когда дело доходит до введения и удаления, это зависит от того, где данные вставляются или удаляются. Это результат упорядоченного характера массивов.
Вставка элементов в конце массива с использованием push ()
Метод имеет большое постоянное время O (1)
Анкет Это связано с тем, что JavaScript рассматривает индекс последнего элемента и добавляет новый элемент с индексом, эквивалентным численному значению последнего индекса плюс 1. С другой стороны, вставка элемента в начале массива является линейным временем O (n)
Анкет Это связано с тем, что все существующие элементы в массиве должны быть повторно индексированы. Те же принципы применяются при удалении элементов из массива. Таким образом, используя толкать
и поп
всегда быстрее, чем использование сдвиг
и без устранения
Анкет
Методы массива
Большой O из нескольких стандартных встроенных методов массивов уже обсуждался в приведенных выше параграфах (Push, POP, Shift и Unshift).
- push:
O (1)
Анкет - Поп:
O (1)
Анкет - Сдвиг:
O (n)
Анкет - без устранения:
На)
Другими методами являются CONCAT, SLICE, сплайс и все функции высшего порядка. (Foreach, Map, Filter, уменьшение и т. Д.). Ниже приведены их соответствующий анализ производительности, основанный на Big O.
- concat:
O (n)
Анкет (добавление или объединение двух массивов) - Slice:
O (n)
Анкет (возвращает копию части или всего массива) - Сплайс:
O (n)
Анкет (Удалите или добавьте элементы в любом месте в массиве) - foreach/map/filter/уменьшить/и т. Д.:
O (n)
Анкет
Для получения дополнительной информации о том, как работает каждый из них, вы можете обратиться к MDN Web Docs Анкет
Вывод
- Объекты быстрее практически во всем, но не имеют никаких заказов.
- Массивы хороши, когда вам нужны заказанные данные.
- Работая с массивами, если это не абсолютно необходимо, избегайте добавления и удаления элементов в/с начала массива.
Изображение обложки от Ади Гольдштейн на unsplash
Оригинал: “https://dev.to/adafia/brief-performance-analysis-of-arrays-and-objects-through-the-lens-of-big-o-notation-4id3”