Conversão de inteiros para interface {} no Go 1.15

Nos laptops da versão Go 1.15, encontrei a seguinte entrada :

A conversão de pequenos valores inteiros para a interface agora ocorre sem alocações.
Neste breve post vou contar o que é otimização.



Como a interface {} funciona no Go



Para entender como essa otimização funciona, você precisa aperfeiçoar a interface {} do dispositivo em Go. Não vou mergulhar muito neste tópico, apenas relembrar as idéias principais.



Dentro de src / runtime / runtime2.go, há uma estrutura como esta:



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


Esta é a nossa interface. Na verdade, a interface {} tem apenas 2 ponteiros:



  • data - um ponteiro para os próprios dados, para os quais a memória foi alocada no heap
  • guia - meta informação sobre a interface e tipo de base


Visualizamos o conhecimento adquirido e seguimos em frente.







Qual é o problema real 



Em Go, alocar novos objetos no quadril é caro. Portanto, se você deseja escrever um código produtivo, definitivamente enfrentará esse problema. Portanto, qualquer otimização, mesmo à primeira vista, pode melhorar o desempenho de todo o aplicativo.



O problema que a otimização considerada resolve é que é um desperdício alocar objetos para números inteiros pequenos.



Como foi resolvido



Aqui está o que os caras da Go fizeram. No pacote runtime, eles já tinham uma matriz estática de inteiros de 0 a 255. No momento em que um inteiro é convertido para a interface {}, é feita uma verificação se esse número está no intervalo especificado e, se estiver, um ponteiro para um elemento nesta matriz. Isso elimina a alocação desnecessária.



Você pode ver as mudanças no gihab .



Esses tipos de otimizações não são novos no Go. Portanto, se você criar uma string ascii de um caractere, não haverá alocações de memória. Não haverá todos eles de acordo com o mesmo cenário: o tempo de execução Go contém uma matriz estática de strings de um caractere. A propósito, não se preocupe, pois hoje em dia apenas um array estático de valores de 0 a 255 vive em tempo de execução, sendo reutilizado para representações de strings.



All Articles