¡Saludos, Topos! Durante el año inicial de trabajo con Golang, seguí pensando que debía haber un orden de campos y pensé ¿por qué debería preocuparme por eso? Bueno, son solo campos, solo que puede ser algo malo, ¿verdad? Como la mayoría de los otros novatos, pensé que no valía la pena molestarme. En otras palabras, ¿qué tan vital podría ser que ciertos campos en una estructura se coloquen en un orden específico? Bueno, ¡muchísimo!
El orden de los campos es uno de los aspectos ignorados al principio, pero a medida que avanzamos con el tutorial, esta comprensión, en particular de cómo funciona Go con punteros, se considera muy crítica. En realidad, es precisamente este orden el que resulta fundamental cuando se trata de mejorar el rendimiento de las aplicaciones, especialmente cuando se trabaja con grandes conjuntos de datos u operaciones que consumen demasiada memoria. Esa desafortunada deficiencia se solucionará al comprender mejor por qué es tan importante con los pedidos de campo de Go.
Cuando se colocan en la memoria, las estructuras se representan como un bloque de memoria consecutiva, en el que todos los campos se ubican uno tras otro según su definición en una estructura. Esto puede parecer bastante simple, pero este tipo de organización lineal también tiene efectos bastante significativos, particularmente en áreas como la alineación y el relleno de la memoria.
La alineación de la memoria se refiere a cómo se colocan los datos y se accede a ellos desde la memoria. Normalmente, CPUS puede tener un sesgo en términos de dónde se recuperan los datos en la memoria, lo que se conoce como límites de alineación. Por ejemplo, se debe colocar o recuperar un entero de 32 bits de la dirección del cuarto byte. En los casos en que haya campos en su estructura que no estén alineados correctamente, al hojear las páginas, un compilador de Go puede agregar bytes de relleno, etc. Esto resulta bastante derrochador. Por ejemplo, mire esta estructura.
struct example{ a bool // 1 byte b int32 // 4bytes; c bool // 1byte d int64 //8 bytes }
En esta estructura incorrecta debido a reglas de alineación, el compilador Go podría agregar uno o más bytes de relleno en medio de estos campos:
a es 1 byte pero b quiere 4 bytes alinear, por lo tanto, el relleno se inserta 3bytes
b la longitud es de 4bytes
la longitud de c es de 1 byte pero para alinear d, que requiere 8 bytes, hay 7asing, por lo que se introduce el relleno.
la longitud d es de 8 bytes
Como la madera es madera estructural, todavía tiene un tamaño de 24 debido a las patas, aunque el contenido solo ocupa 14 sin embargo, mire el volumen del contenido real más el del relleno. .
El orden de los campos y la búsqueda de estructuras pueden ayudar a evitar el desperdicio de espacio en forma de margen negativo. En otras palabras:
type Example struct { d int64 // 8 bytes b int32 // 4 bytes a bool // 1 byte c bool // 1 byte }
En la estructura optimizada anterior:
d ocupa 8 bytes.
b ocupa 4 bytes.
ayc ocupa 1 byte cada uno sin necesidad de relleno.
Esta estructura ahora tiene solo 16 bytes de tamaño y es mejor que la anterior estructura de 24 bytes.
Al considerar aplicaciones comunes a pequeña escala, lo más probable es que encuentre que la cantidad de memoria utilizada por la aplicación no es diferente de esta última. Sin embargo, este no es el caso en la construcción, donde el rendimiento e incluso el espacio de memoria son críticos. Considere un sistema integrado, aplicaciones comerciales de alta frecuencia súper rápidas o aplicaciones destinadas a procesar una enorme cantidad de datos que estas fieles restricciones pueden acumular rápidamente. Esto se vuelve aún más evidente cuando uno construye u opera usando muchas matrices grandes o porciones de estructuras concatenadas. No es tan fácil notar el sesgo o la unión de carga cuando una estructura tiene solo unos pocos bytes más de capacidad. Cuando la arquitectura de baja memoria se produce en masa, con la cantidad de millones de instancias que deben manejarse, poco a poco, esta sobredosis adictiva de desperdicio ya no es algo inaudito.
Ordenar campos no solo es bueno desde el punto de vista del diseño de estructuras de Golang, sino que también juega un papel importante en la optimización de la memoria. Comprender este aspecto de cómo Go diseña la memoria para sus estructuras y sus píxeles permite un diseño de estructuras más efectivo en la práctica. Un ajuste tan insignificante puede provocar un aumento considerable del rendimiento cuando se trata de aplicaciones que hacen un uso intensivo de la memoria. Cuando se presente la próxima oportunidad de definir una estructura en Go, no se limite a derramar esos campos. En su lugar, dedica un minuto a considerar la secuencia: ¡te lo agradecerás a ti mismo y a tu solicitud en los próximos días!
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3