小整数值到接口的转换现在无需分配。在这篇简短的文章中,我将告诉您优化是什么。
接口{}在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的静态值数组在运行时中存在。它被重用于字符串表示形式。