Привет, Суслики! В течение первого года работы с Golang я все время думал, что поля должны быть упорядочены, и думал, почему меня это должно волновать? Ну, это всего лишь поля, только может быть что-то не так, я так понимаю? Как и большинство других новичков, я подумал, что об этом не стоит беспокоиться. Другими словами, насколько важно, чтобы определенные поля в структуре располагались в определенном порядке? Ну, отличная сделка!
Упорядочение полей — это один из аспектов, игнорируемых в начале, но по мере изучения руководства понимание того, как Go работает с указателями, становится очень важным. Собственно, именно этот порядок имеет решающее значение, когда речь идет об улучшении производительности приложений, особенно при работе с большими наборами данных или операциями, которые слишком сильно нагружают память. Этот досадный недостаток будет исправлен благодаря лучшему пониманию того, почему это так важно при упорядочивании полей Go.
При размещении в памяти структуры представляются как блок последовательной памяти, в котором все поля располагаются одно за другим согласно их определению в структуре. Это может показаться довольно простым, но такая линейная организация также имеет весьма существенные последствия, особенно в таких областях, как выравнивание и заполнение памяти.
Выравнивание памяти связано с тем, как данные размещаются в памяти и получают к ним доступ. Обычно ЦП может иметь предвзятость в отношении того, где данные извлекаются в памяти, что называется границами выравнивания. Например, 32-битное целое число должно быть помещено или получено по адресу 4-го байта. В случаях, когда в вашей структуре есть поля, которые не выровнены должным образом, при пролистывании страниц компилятор Go может добавить байты заполнения и так далее. Это становится довольно расточительно. Например, посмотрите на эту структуру.
struct example{ a bool // 1 byte b int32 // 4bytes; c bool // 1byte d int64 //8 bytes }
В этой неправильной структуре из-за правил выравнивания компилятор Go может добавить один или несколько байтов заполнения в середине этих полей:
a — 1 байт, но b хочет 4 байта выровнять, поэтому вставляется заполнение 3 байта
длина b составляет 4 байта
c длина составляет 1 байт, но для выравнивания d, для которого требуется 8 байт, требуется 7asing, следовательно, вводится дополнение.
d длина составляет 8 байт
Как дерево является структурным деревом, его размер по-прежнему составляет 24 из-за ножек, хотя содержание занимает всего 14 однако посмотрите на объем фактического содержимого плюс объем набивки .
Порядок полей и поиск структуры могут помочь избежать пустой траты места в виде отрицательного поля. Другими словами:
type Example struct { d int64 // 8 bytes b int32 // 4 bytes a bool // 1 byte c bool // 1 byte }
В приведенной выше оптимизированной структуре:
d занимает 8 байт.
b занимает 4 байта.
a и c занимают 1 байт каждый без необходимости заполнения.
Эта структура теперь имеет размер всего 16 байт, и это лучше, чем прежняя структура размером 24 байта.
Рассматривая обычные небольшие приложения, он или она, скорее всего, обнаружит, что объем памяти, используемый приложением, ничем не отличается от последнего. Однако это не тот случай в строительстве, где производительность и даже объем памяти имеют решающее значение, учитывая встроенные в систему сверхбыстрые высокочастотные торговые приложения или приложения, предназначенные для обработки огромных объемов данных, которые эти строгие ограничения могут быстро накапливаться. Это становится еще более очевидным, когда кто-то конструирует или работает с использованием множества больших массивов или объединенных фрагментов структур. Не так легко заметить смещение или объединение нагрузки, когда структура имеет емкость всего на несколько байт выше. Когда архитектура с низким объемом памяти выпускается массово, и количество экземпляров, которые приходится обрабатывать постепенно, становится не чем-то неслыханным.
Упорядочение полей не только удобно с точки зрения проектирования структур Golang, но также играет важную роль в оптимизации памяти. Понимание этого аспекта того, как Go распределяет память для ваших структур и их пикселей, позволяет на практике более эффективно проектировать структуры. Такая незначительная настройка может привести к значительному увеличению производительности приложений, интенсивно использующих память. Когда вам представится следующая возможность определить структуру в Go, не разбрасывайте эти поля повсюду. Вместо этого потратьте одну минуту на обдумывание последовательности — в ближайшие дни вы будете благодарны себе и своему приложению за это!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3