На этот раз мы рассмотрим разницу в производительности между коллекциями данных фиксированного и динамического размера.

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

вступление

Прежде чем мы начнем, давайте рассмотрим различные существующие коллекции данных. В случае наборов данных фиксированного размера существуют массивы. С другой стороны, у нас есть карты и срезы. Срезы в упрощенном виде похожи на массивы с более общим и мощным интерфейсом и без фиксированного размера. Карта — это то, что в других языках называется словарем или хэшем. Просто набор данных, в котором каждая запись имеет свой собственный ключ.

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

  • Срезы против массивов! Что работает лучше?
  • Срезы против карт! Влияет ли использование пользовательского ключа на производительность?

Срезы против массивов

Для более глубокого сравнения срезов с массивами я создал бенчмарк-тесты для обоих случаев. Начнем с их запуска для обоих подходов. Сохраните результаты в файл и, наконец, сравните их с Benchstat. Ниже вы можете увидеть оба эталонных теста:

Сравнительный тест массива

Сравнительный тест среза

Я думаю, что оба фрагмента кода в значительной степени говорят сами за себя. Вы можете увидеть две функции для каждого фрагмента. В первом я добавляю много чисел к моему массиву/срезу в зависимости от числа, которое я ввожу в функцию. Второй — мой фактический тест производительности. Здесь я вызываю первую функцию и проверяю, сколько времени потребуется, чтобы обогатить наш массив/срез всеми числами.

Сравнение

Затем мы хотим узнать, какой из них более производительный и насколько велика разница. Для этого мы сохраняем результаты обоих тестов и сравниваем их с Benchstat.

benchstat slice.txt array.txt

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

Еда на вынос

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

Последние мысли

Это была первая часть «Коллекции данных фиксированного и динамического размера». Надеюсь, сравнение массивов со срезами было интересным и вы узнали что-то новое. Если у вас есть, что упомянуть или есть вопросы, было бы здорово, если бы вы оставили их в комментариях. До скорой встречи.

P.S. Эта статья является частью новой серии. В течение следующих нескольких недель я рассмотрю различные общие вспомогательные функции, интересные тесты и полезные функции.

Если вы так же взволнованы, как и я, следите за обновлениями!