在Go 1.15中将整数转换为接口{}

在Go笔记本电脑的1.15版本中,我找到了以下条目

小整数值到接口的转换现在无需分配。
在这篇简短的文章中,我将告诉您优化是什么。



接口{}在Go中的工作方式



要了解此优化的工作原理,您需要在Go中的界面{}设备上进行复习。我不会过多地探讨这个主题,只是回顾一下主要思想。



src / runtime / runtime2.go内部,有一个像这样的结构:



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


这是我们的界面。实际上,接口{}只有2个指针:



  • data-指向数据本身的指针,在堆上为其分配了内存
  • tab-有关接口和基本类型的元信息


我们将获得的知识形象化并继续前进。







实际问题是什么 



在Go中,在臀部分配新对象非常昂贵。因此,如果您想编写高效的代码,那么您肯定会遇到这个问题。因此,任何乍看之下的优化都可以改善整个应用程序的性能。



所考虑的优化解决的问题是为小整数分配对象是一项浪费的工作。



怎么解决的



这是Go的家伙所做的。在运行时程序包中,它们已经有一个从0到255的整数的静态数组。在将整数转换为接口{}时,将检查该数字是否在指定范围内,如果是,则指向该指针。此数组中的一个元素。这消除了不必要的分配。



您可以在gihab上看到更改



这些类型的优化在Go中并不新鲜。因此,如果您创建一个单字符的ascii字符串,将没有内存分配。在相同的情况下,不会全部使用它们:Go运行时包含单字符字符串的静态数组。顺便说一下,别担心,因为如今只有一个从0到255的静态值数组在运行时中存在。它被重用于字符串表示形式。



All Articles