Найти тему
Golang

[Golang] Написание структур Go с эффективным использованием памяти и оптимизацией ЦП

Структуры представляют тип данных, определяемый разработчиком и служащий для представления каких-либо объектов. Структуры содержат набор полей, которые представляют различные атрибуты объекта. Для определения структуры применяются ключевые слова type и struct:

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

В этом посте я попытаюсь объяснить, как мы можем эффективно писать структуры с точки зрения использования памяти ЦП.

Давайте рассмотрим структуру ниже:

-2

Теперь посмотрим, сколько памяти требуется для структуры TerraformResource, используя приведенный ниже код.

-3

Код

Вывод:

-4

Таким образом, общий объем памяти, необходимый для создаой структуры TerraformResource, составляет 88 байт. Так будет выглядеть выделение памяти для типа TerraformResource

-5

Но почему 88 байт, 16 + 16 + 1 + 16 + 1 + 16 + 4 = 70 байт, откуда берутся эти дополнительные 18 байт?

Когда дело доходит до выделения памяти для структур, им всегда выделяются , выровненные по байтам блоки памяти, а поля выделяются и сохраняются в том порядке, в котором они определены. Подробнее про выделение памяти в GO можно почитать здесь.

-6

Мы ясно видим, что TerraformResource.HaveDSL , TerraformResource.isVersionControlled и TerraformResource.ModuleVersionMajor занимают 1 байт, 1 байт и 4 байта соответственно. Остальное пространство заполняется пустыми байтами

Итак, возвращаясь к той же математике

Байты распределения = 16 байт + 16 байт + 1 байт + 16 байт + 1 байт + 16 байт + 4 байта = 70 байт

Пустые байты заполнения = 7 байт + 7 байт + 4 байта = 18 байт

Всего байтов = байты распределения + пустые байты заполнения = 70 байтов + 18 байтов = 88 байтов

Итак, как мы это исправим? А что, если мы переопределим нашу структуру следующим образом.

-7

-8

Код

Вывод:

-9

Теперь общее выделение памяти для типа TerraformResource составляет 72 байта. Давайте посмотрим, как выглядит выравнивание памяти.

-10

Однако оптимизированная структура содержит всего 9 слов, как показано ниже.

-11

Определив нашу структуру с правильно определенными структурами данных, мы смогли эффективно использовать выделение памяти и реализовали правильную и эффективную структуру с точки зрения потребления ресурсов ЦП.

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

Надеюсь, что этот пост смог пролить свет на внутреннее устройство структур, их распределение памяти и потребляемые ресурсы ЦП. Надеюсь этот пост вам поможет!!

Удачного кодинга!!

Golang
Go tests