Conversi贸n de n煤meros enteros en interfaz {} en Go 1.15

En las computadoras port谩tiles Go 1.15, encontr茅 la siguiente entrada :

La conversi贸n de valores enteros peque帽os a la interfaz ahora ocurre sin asignaciones.
En este breve post te dir茅 cu谩l es la optimizaci贸n.



C贸mo funciona la interfaz {} en Go



Para comprender c贸mo funciona esta optimizaci贸n, debe repasar la interfaz {} del dispositivo en Go. No me sumergir茅 demasiado en este tema, solo recordar茅 las ideas principales.



Dentro de src / runtime / runtime2.go hay una estructura como esta:



type iface struct {
	tab  *itab
	data unsafe.Pointer
}


Esta es nuestra interfaz. De hecho, la interfaz {} tiene solo 2 punteros:



  • datos: un puntero a los datos en s铆, para los cuales se asign贸 la memoria en el mont贸n
  • pesta帽a: metainformaci贸n sobre la interfaz y el tipo de base


Visualizamos los conocimientos adquiridos y seguimos adelante.







Cual es el problema real 



En Go, la asignaci贸n de nuevos objetos en la cadera es costosa. Por lo tanto, si desea escribir c贸digo productivo, definitivamente enfrentar谩 este problema. Por lo tanto, cualquier optimizaci贸n menor, incluso a primera vista, puede mejorar el rendimiento de toda la aplicaci贸n.



El problema que resuelve la optimizaci贸n considerada es que es una empresa in煤til asignar objetos para n煤meros enteros peque帽os.



Como se soluciono



Esto es lo que hicieron los chicos de Go. En el paquete de tiempo de ejecuci贸n, ya ten铆an una matriz est谩tica de enteros de 0 a 255. En el momento en que un entero se convierte en interfaz {}, se verifica si este n煤mero est谩 en el rango especificado y, de ser as铆, un puntero a un elemento de esta matriz. Esto elimina la asignaci贸n innecesaria.



Puede ver los cambios en el gihab .



Este tipo de optimizaciones no son nuevas en Go. Entonces, si crea una cadena ascii de un solo car谩cter, no habr谩 asignaciones de memoria. No habr谩 todos de acuerdo con el mismo escenario: el tiempo de ejecuci贸n de Go contiene una matriz est谩tica de cadenas de un solo car谩cter. Por cierto, no se preocupe, ya que ahora solo una matriz est谩tica de valores de 0 a 255 vive en tiempo de ejecuci贸n y se reutiliza para representaciones de cadenas.



All Articles