Скорость увеличения емкости Go slices

Я новичок в го и просматриваю книгу под названием «Изучение го», изданную O'reilly. Читая о срезах, ниже приводится утверждение:

Чтобы увеличить размер среза, начиная с Go 1.14 правило состоит в том, что он удваивает емкость до достижения размера 1024, а затем увеличивается на 25% после этого».

Я написал этот код Go, чтобы доказать это.

package main

import "fmt"

func main() {
    var length uint16 = 1024

    var x []int

    for i := 0; i < int(length); i++ {
        x = append(x, i)
        fmt.Printf("\nLength is %d. Capacity is %d", len(x), cap(x))
    }
}

Доказано, что от 0 до len(x)==512 среда выполнения Go удваивает емкость (также известную как размер). Но здесь начинается самое интересное для меня: когда len(x) >= 512, я ожидал, что емкость будет 1024, поскольку 512*2 = 1024. Однако результат ниже:

Length is 513. Capacity is 848

Таким образом, это примерно 65-процентное увеличение. Может кто-то объяснить это мне?

Ответ в том, что он изменился с версии go1.14 и может измениться снова. Фактическое поведение зависит от реализации.

JimB 04.02.2023 22:56
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
7
1
167
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

начиная с версии 1.14

Go 1.20 только что был выпущен (выпущен 01 февраля 2023 г.). Начата работа над Go 1.21. Прочтите исходный код Go, чтобы увидеть изменения по сравнению с Go 1.14 (выпущенным 25 февраля 2020 г.).

Например,

go/src/runtime/slice.go:

// Transition from growing 2x for small slices
// to growing 1.25x for large slices. This formula
// gives a smooth-ish transition between the two.

время выполнения: сделайте формулу роста среза более плавной (Совершено в понедельник, 27 сентября, 20:53:51 2021 г.):

Instead of growing 2x for < 1024 elements and 1.25x for >= 1024 elements,
use a somewhat smoother formula for the growth factor. Start reducing
the growth factor after 256 elements, but slowly.

starting cap    growth factor
256             2.0
512             1.63
1024            1.44
2048            1.35
4096            1.30

(Note that the real growth factor, both before and now, is somewhat
larger because we round up to the next size class.)

Другие вопросы по теме