Table of Contents
Question content
Solution
Home Backend Development Golang Why does converting 'interface{}' back to a slice result in extra heap allocation?

Why does converting 'interface{}' back to a slice result in extra heap allocation?

Feb 12, 2024 pm 10:15 PM
implicit conversion

Why does converting interface{} back to a slice result in extra heap allocation?

In PHP, converting the "interface{}" type to the slice type will result in additional heap allocation. This is because in PHP, an interface is an abstract data type, and a slice is a dynamic array type. When we convert an interface type to a slice type, PHP needs to allocate additional memory space for the slice type to store the elements of the slice. This additional heap allocation operation will cause additional memory overhead, which may cause performance issues for some memory-sensitive applications. Therefore, when performing type conversion, we should pay attention to this issue and try to avoid unnecessary additional heap allocation.

Question content

1

2

3

4

5

6

7

8

9

10

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)

    }

}

Copy after login

This benchmark gives the following output in go1.19.5.

1

2

benchmarkpool

benchmarkpool-10        47578498            24.47 ns/op       24 b/op          1 allocs/op

Copy after login

Things look different when using *[]byte:

1

2

3

4

5

6

7

8

9

10

11

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)

    }

}

Copy after login

1

2

BenchmarkPool

BenchmarkPool-10        142008002            8.581 ns/op           0 B/op          0 allocs/op

Copy after login

It seems that converting interface{} back to a slice results in additional heap allocations.

Why does go need this extra allocation? What are the design considerations behind this?

Solution

What causes the allocation is not the conversion of any to []byte, but the conversion of []byte to Conversion of any. p.Put(bts) Implicitly converts the parameter bts to any before passing it to (*sync.Pool).Put . The interface in GoGC 1.19 is implemented as a pair of pointers, one pointing to the type metadata and one pointing to the actual object, in this case the second pointer is escaped to the pool, causing the slice object to be allocated. This applies not only to slice types, but also to any other non-pointer type.

For pointers, such as *[]byte, the compiler performs optimizations that place their values ​​directly into the iface structure, thus removing the when converting to an interface. *[]byte Allocation of instances. Therefore, it is generally recommended to put pointers into a pool rather than the structure itself.

The above is the detailed content of Why does converting 'interface{}' back to a slice result in extra heap allocation?. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

How to use short in java How to use short in java May 07, 2024 am 03:33 AM

short is a primitive data type in Java that represents a 16-bit signed integer in the range -32,768 to 32,767. It is often used to represent small integers, such as counters or IDs, and supports basic arithmetic operations and type conversions. But since short is a signed type, you need to be careful when using division to avoid overflow or underflow.

Usage of ifnull in sql Usage of ifnull in sql Apr 28, 2024 am 09:57 AM

The IFNULL function checks whether an expression is NULL and returns the specified default value if so, otherwise it returns the value of the expression. It prevents null values ​​from causing errors, allows manipulation of null values, and improves the readability of queries. Usage includes: replacing null values ​​with default values, excluding null values ​​from calculations, and nested usage to handle multiple null value situations.

How to calculate division in c language How to calculate division in c language Apr 13, 2024 pm 09:12 PM

In C language, the behavior of the division operator / depends on the data type of the operands: Integer division: When the operand is an integer, integer division is performed and the result is rounded down. Floating point division: When the operand is a floating point number, floating point division is performed and the result is a floating point number. Type conversion: When one operand is an integer and the other is not, the integer is implicitly converted to a floating point number, and then floating point division is performed. Divisor by 0: A mathematical error occurs when the divisor is 0. Modulo operation: Use the % operator for modulo operation instead of modulo division.

What does char in java mean? What does char in java mean? May 01, 2024 pm 06:15 PM

The char type in Java is used to store a single Unicode character, accounting for 2 bytes, ranging from U+0000 to U+FFFF. It is mainly used to store text characters. It can be initialized through single quotes or Unicode escape sequences, and can participate in comparison, Equality, inequality and join operations can be implicitly converted to int type or explicitly converted to Character objects.

What are the matching rules for C++ function overloading? What are the matching rules for C++ function overloading? Apr 27, 2024 am 08:27 AM

The C++ function overload matching rules are as follows: match the number and type of parameters in the call. The order of parameters must be consistent. The constness and reference modifiers must match. Default parameters can be used.

What does * mean in mysql What does * mean in mysql Apr 26, 2024 am 07:21 AM

The asterisk (*) in MySQL means "all" and has different uses: Select all columns Select all rows JOIN wildcards for table LIKE clause Quantifier implicit type conversion for REGEXP clause

Usage of (+ in oracle Usage of (+ in oracle May 08, 2024 pm 08:12 PM

The plus (+) operator in Oracle can be used to: connect strings, numbers, dates, and time intervals; handle NULL values ​​and convert NULL to non-NULL values; convert data types to string types.

What are the PHP function parameter types? What are the PHP function parameter types? Apr 10, 2024 pm 04:21 PM

PHP function parameter types include scalar types (integers, floating point numbers, strings, Boolean values, null values), composite types (arrays, objects) and special types (callback functions, variable parameters). Functions can automatically convert parameters of different types, but they can also force specific types through type declarations to prevent accidental conversions and ensure parameter correctness.

See all articles