Saudações, Esquilos! Durante o primeiro ano de trabalho com Golang, fiquei pensando que deveria haver ordenação de campos e pensei por que deveria me preocupar com isso? Bom, são só campos, só pode ser alguma coisa errada, certo? Como a maioria dos outros novatos, achei que não valia a pena me preocupar com isso. Em outras palavras, quão vital seria que certos campos em uma estrutura fossem colocados em uma ordem específica? Bem, muito!
A ordem dos campos é um dos aspectos ignorados no início, mas à medida que avançamos no tutorial, esse entendimento, particularmente de como o Go funciona com ponteiros, é entendido como muito crítico. Na verdade, é precisamente esta ordem que é crítica quando se trata de melhorar o desempenho da aplicação, especialmente quando se trabalha com grandes conjuntos de dados ou operações que ocupam muita memória. Essa infeliz deficiência será corrigida com uma melhor compreensão de por que é tão importante com o pedido de campos Go.
Quando colocadas na memória, as structs são representadas como um bloco de memória consecutiva, no qual todos os campos são localizados um após o outro de acordo com sua definição em uma estrutura. Isto pode parecer bastante simples, mas este tipo de organização linear também tem alguns efeitos bastante significativos, particularmente em áreas como alinhamento e preenchimento de memória.
O alinhamento da memória trata de como os dados são colocados e acessados da memória. Normalmente, o CPUS pode ter uma tendência em termos de onde os dados são buscados na memória, o que é conhecido como limites de alinhamento. Por exemplo, um número inteiro de 32 bits deve ser colocado ou obtido do endereço do quarto byte. Nos casos em que há campos em sua estrutura que não estão alinhados corretamente, folheando as páginas, um compilador Go pode adicionar bytes de preenchimento e assim por diante. Isso se torna um desperdício. Por exemplo, observe esta estrutura.
struct example{ a bool // 1 byte b int32 // 4bytes; c bool // 1byte d int64 //8 bytes }
Nesta estrutura inadequada devido às regras de alinhamento, o compilador Go pode adicionar um ou mais bytes de preenchimento no meio destes campos:
a tem 1 byte, mas b deseja 4 bytes alinhamento, portanto, o preenchimento é inserido 3bytes
b é de 4 bytes
c é de 1 byte, mas para alinhar d, que requer 8 bytes, há 7asing, portanto, o preenchimento é introduzido.
d comprimento é de 8 bytes
Como a madeira é madeira estrutural, ainda tem 24 de tamanho por causa das pernas, embora o conteúdo leve apenas 14, no entanto, observe o volume do conteúdo real mais o do preenchimento .
A localização da ordem e da estrutura dos campos pode ajudar a evitar o desperdício de espaço na forma de margem negativa. Em outras palavras:
type Example struct { d int64 // 8 bytes b int32 // 4 bytes a bool // 1 byte c bool // 1 byte }
Na estrutura otimizada acima:
d ocupa 8 bytes.
b ocupa 4 bytes.
a e c ocupam 1 byte cada um sem a necessidade de preenchimento.
Essa estrutura agora tem apenas 16 bytes de tamanho e é melhor do que a antiga estrutura de 24 bytes.
Ao considerar aplicativos comuns de pequena escala, ele provavelmente descobrirá que a quantidade de memória usada pelo aplicativo não é diferente da última. Este, entretanto, não é o caso na construção onde o desempenho e até mesmo o espaço de memória são críticos, considere um sistema incorporado, aplicativos de negociação de alta frequência super rápidos ou aplicativos destinados a processar uma enorme quantidade de dados que essas restrições fiéis podem aumentar rapidamente. Isso se torna ainda mais evidente quando se constrói ou opera usando muitos arrays grandes ou fatias concatenadas de estruturas. Não é tão fácil perceber viés ou união de carga quando uma estrutura tem apenas alguns bytes a mais de capacidade. Quando a arquitetura com pouca memória é produzida em massa, com a quantidade de milhões de instâncias a serem tratadas, aos poucos, essa overdose viciada de desperdício não é mais inédita.
Ordenar campos não é apenas agradável do ponto de vista do design da estrutura Golang, mas também desempenha um papel importante na otimização da memória. Compreender esse aspecto de como Go faz o layout de memória para suas estruturas e seus pixels permite um design de estrutura mais eficaz na prática. Um ajuste tão insignificante pode causar um aumento considerável no desempenho quando se trata de aplicativos que fazem uso intenso de memória. Quando chegar a próxima oportunidade de você definir uma estrutura em Go, não apenas espalhe esses campos. Em vez disso, gaste um minuto considerando a sequência - você ficará grato a si mesmo e à sua inscrição nos próximos dias!
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3