медленное построение длинной строки с использованием "+ =" - PullRequest
0 голосов
/ 11 октября 2019

У меня очень низкая производительность http отклика

Использовал Go и Fasthttp

package main

import (
    "fmt"
    "github.com/valyala/fasthttp"
)

func fastHTTPHandler(ctx *fasthttp.RequestCtx) {
    var s string = ""
    for i := 1; i <= 100000; i++ {
        s += "hello "
    }
    ctx.SetBodyString(s)
}

func main() {
    fmt.Print("Started")
    fasthttp.ListenAndServe(":8081", fastHTTPHandler)
}

И протестировал его в Бессоннице (Почтальон). Время исполнения 3-4 сек. Аналогичный код на PHP выполняется за 900 мс.

PHP img

Golang img

1 Ответ

3 голосов
/ 12 октября 2019

Использование += практически для любого языка для конкатенации больших строк обычно приводит к ужасной производительности, поэтому я бы не стал использовать это в качестве показателя для чего-либо связанного с производительностью. Вот почему большинство языков имеют что-то в своей стандартной библиотеке для создания больших строк. В Java вы бы использовали java.lang.StringBuilder. В Go они добавили strings.Builder некоторое время назад. Я не запускал его, но я уверен, что это даст гораздо лучшую производительность:

s := strings.Builder{}
for i := 1; i <= 100000; i++ {
    s.WriteString("hello ")
}
ctx.SetBodyString(s.String())
...