пятница, 6 марта 2020 г.

Эффективная конкатенация строк в Golang

Простое создание строк

Для простых случаев, когда производительность не является проблемой, fmt.Sprintf - ваш друг. Это чисто, просто и довольно эффективно.

s := fmt.Sprintf("Size: %d MB.", 85) // s == "Size: 85 MB."

Высокопроизводительная конкатенация строк с версии Go 1.10

strings.Builder используется для эффективного добавления строк с использованием методов записи.

  • Он предлагает подмножество методов bytes.Buffer, что позволяет безопасно избежать дополнительного копирования при преобразовании Builder в строку.
  • Вы можете использовать пакет fmt для форматирования, поскольку Builder реализует интерфейс io.Writer.
  • Метод Grow может использоваться для предварительного выделения памяти, когда известен максимальный размер строки.

var b strings.Builder
b.Grow(32)
for i, p := range []int{2, 3, 5, 7, 11, 13} {
    fmt.Fprintf(&b, "%d:%d, ", i+1, p)
}
s := b.String()   // нет копирования

s = s[:b.Len()-2] // нет копирования 
                  // (удаляет завершающий ", ")
fmt.Println(s)

Вывод:

1:2, 2:3, 3:5, 4:7, 5:11, 6:13

Создание строк до версии Go 1.10

Используйте fmt.Fprintf для печати в bytes.Buffer.

var buf bytes.Buffer
for i, p := range []int{2, 3, 5, 7, 11, 13} {
    fmt.Fprintf(&buf, "%d:%d, ", i+1, p)
}
buf.Truncate(buf.Len() - 2) // Удаляет завершающий ", "
s := buf.String()           // Копирует в новую строку
fmt.Println(s)

Вывод:

1:2, 2:3, 3:5, 4:7, 5:11, 6:13

Это решение довольно эффективно, но может привести к появлению лишнего мусора. Для более высокой производительности вы можете попробовать использовать функции добавления в пакете strconv.

buf := []byte("Size: ")
buf = strconv.AppendInt(buf, 85, 10)
buf = append(buf, " MB."...)
s := string(buf)

Если ожидаемая максимальная длина строки известна, вы можете предварительно выделить срез.

buf := make([]byte, 0, 16)
buf = append(buf, "Size: "...)
buf = strconv.AppendInt(buf, 85, 10)
buf = append(buf, " MB."...)
s := string(buf)


Читайте также:


Купить gopher

Комментариев нет:

Отправить комментарий