目录
问题内容
解决方法
首页 后端开发 Golang 为什么将'interface{}”转换回切片会导致额外的堆分配?

为什么将'interface{}”转换回切片会导致额外的堆分配?

Feb 12, 2024 pm 10:15 PM
隐式转换

为什么将interface{}”转换回切片会导致额外的堆分配?

在PHP中,将“interface{}”类型转换为切片(slice)类型时,会导致额外的堆分配。这是因为在PHP中,接口(interface)是一种抽象的数据类型,而切片是一种动态数组类型。当我们将接口类型转换为切片类型时,PHP需要为切片类型分配额外的内存空间来存储切片的元素。这个额外的堆分配操作会导致内存的额外开销,对于一些内存敏感的应用程序来说,可能会带来性能问题。因此,在进行类型转换时,我们应该注意这个问题,尽量避免不必要的额外堆分配。

问题内容

func benchmarkpool(b *testing.b) {
    b.reportallocs()
    p := sync.pool{new: func() interface{} {
        return make([]byte, 1024)
    }}
    for i := 0; i < b.n; i++ {
        bts := p.get().([]byte)
        p.put(bts)
    }
}
登录后复制

该基准测试在 go1.19.5 中给出以下输出。

benchmarkpool
benchmarkpool-10        47578498            24.47 ns/op       24 b/op          1 allocs/op
登录后复制

当使用 *[]byte 时,事情会变得不同:

func benchmarkpool(b *testing.b) {
    b.reportallocs()
    p := sync.pool{new: func() interface{} {
        bts := make([]byte, 1024)
        return &bts
    }}
    for i := 0; i < b.n; i++ {
        bts := p.get().(*[]byte)
        p.put(bts)
    }
}
登录后复制
BenchmarkPool
BenchmarkPool-10        142008002            8.581 ns/op           0 B/op          0 allocs/op
登录后复制

似乎将 interface{} 转换回切片会导致额外的堆分配。

为什么 go 需要这个额外的分配?其背后的设计考虑是什么?

解决方法

造成分配的不是 any[]byte 的转换,而是 []byteany 的转换。 p.Put(bts) 将参数 bts 隐式转换为 any,然后再将其传递给 (*sync.Pool).Put。 GoGC 1.19 中的接口被实现为一对指针,一个指向类型元数据,一个指向实际对象,在这种情况下,第二个指针转义到池,导致分配切片对象。这不仅适用于切片类型,也适用于任何其他非指针类型。

对于指针,例如 *[]byte,编译器会执行优化,将其值直接放入 iface 结构中,从而在转换为接口时删除 *[]byte,编译器会执行优化,将其值直接放入 iface 结构中,从而在转换为接口时删除

实例的分配。因此,通常建议将指针放入池中而不是结构本身。🎜

以上是为什么将'interface{}”转换回切片会导致额外的堆分配?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

java中short的用法 java中short的用法 May 07, 2024 am 03:33 AM

short 是 Java 中一种表示 16 位有符号整数的原始数据类型,其范围为 -32,768 到 32,767。它常用于表示小整数,如计数器或 ID,并支持基本算术运算和类型转换。但由于 short 是一种有符号类型,使用除法时需谨慎,以避免溢出或下溢。

sql中ifnull的用法 sql中ifnull的用法 Apr 28, 2024 am 09:57 AM

IFNULL 函数用于检查表达式是否为 NULL,如果是则返回指定的默认值,否则返回表达式的值。它可以防止空值导致错误,允许操作空值,提高查询的可读性。用法包括:将空值替换为默认值、排除空值进行计算和嵌套使用处理多个空值情况。

c语言怎么算除法 c语言怎么算除法 Apr 13, 2024 pm 09:12 PM

C 语言中,除法运算符 / 的行为取决于操作数的数据类型:整数除法:操作数为整数时,进行整数除法,结果向下取整。浮点数除法:操作数为浮点数时,进行浮点数除法,结果为浮点数。类型转换:一个操作数为整数,另一个不是时,整数会隐式转换为浮点数,然后进行浮点数除法。除数为 0:除数为 0 时产生数学误差。取模运算:使用 % 运算符进行取模运算,而非除法取模。

java中的char是什么意思 java中的char是什么意思 May 01, 2024 pm 06:15 PM

Java 中的 char 类型用于存储单个 Unicode 字符,占 2 个字节,范围从 U+0000 到 U+FFFF,主要用于存储文本字符,可以通过单引号或 Unicode 转义序列初始化,可参与比较、相等性、不相等性和连接运算,可隐式转换为 int 类型,也可以显式转换为 Character 对象。

oracle中(+的用法 oracle中(+的用法 May 08, 2024 pm 08:12 PM

Oracle 中加号(+)运算符可用于:连接字符串、数字、日期和时间间隔;处理 NULL 值,将 NULL 转换为非 NULL 值;转换数据类型为字符串类型。

一起来探索隐式类型转换的常见应用场景! 一起来探索隐式类型转换的常见应用场景! Jan 11, 2024 pm 04:45 PM

让我们一起探讨隐式类型转换的常见应用场景!导言:在编程语言中,隐式类型转换是一种自动执行的数据类型转换过程。在一些编程语言中,这种转换是隐含进行的,无需显式地告诉编译器或解释器进行转换。隐式类型转换在编程中拥有广泛的应用场景,本文将针对其中一些常见的应用场景进行讨论。数值计算中的隐式类型转换在数值计算中,经常需要进行不同类型的数据之间的运算。当不同类型的数据

mysql中*是什么意思 mysql中*是什么意思 Apr 26, 2024 am 07:21 AM

MySQL 中的星号 (*) 表示“所有”,具有不同用法:选择所有列选择所有行JOIN 表LIKE 子句的通配符REGEXP 子句的量词隐式类型转换

C++ 函数重载的匹配规则是什么? C++ 函数重载的匹配规则是什么? Apr 27, 2024 am 08:27 AM

C++函数重载匹配规则如下:匹配调用中参数数量和类型。参数顺序必须一致。constness和引用的修饰符必须匹配。可使用默认参数。

See all articles