Golang fasthttp очень медленный с запросом
Я строю Rest API с пакетом fasthttp. У меня есть тестовый маршрут, который я использую для измерения производительности:
package main
import (
"github.com/valyala/fasthttp"
"runtime"
)
func main() {
runtime.GOMAXPROCS(8)
m := func(ctx *fasthttp.RequestCtx) {
switch string(ctx.Path()) {
case "/test":
test(ctx)
default:
ctx.Error("not found", fasthttp.StatusNotFound)
}
}
fasthttp.ListenAndServe(":80", m)
}
func test(ctx *fasthttp.RequestCtx) {
println("HERE")
}
Если я отправлю запрос по этому маршруту, потребуется более 10 секунд, чтобы добраться до println("HERE")
в тестовой функции.
Я построил сопоставимую конечную точку в Node.js
и эта точно такая же функция и маршрут занимает 126 миллисекунд.
Почему в мире так долго вызывается функция, на которую указывает этот маршрут в Go?
1 ответ
Для меня это займет всего 7,9454545 с на 100000 http.Head
(79,454545us за http.Head
, только с 2-х ядерным процессором в 77% нагрузки при выполнении этих 1 и 2 кодов).
Вам не нужно runtime.GOMAXPROCS(8)
и использовать fmt.Println()
вместо println()
1- Попробуйте это:
package main
import (
"fmt"
"github.com/valyala/fasthttp"
)
func main() {
m := func(ctx *fasthttp.RequestCtx) {
switch string(ctx.Path()) {
case "/test":
test(ctx)
default:
fmt.Println(i)
ctx.Error("not found", fasthttp.StatusNotFound)
}
}
fasthttp.ListenAndServe(":80", m)
}
func test(ctx *fasthttp.RequestCtx) {
i++
}
var i int = 0
выход:
100000
2- С этим получить:
package main
import (
"fmt"
"net/http"
"time"
)
func main() {
t := time.Now()
for i := 0; i < 100000; i++ {
read(`http://localhost/test`)
}
fmt.Println(time.Since(t))
read(`http://localhost/`)
}
func read(url string) {
_, err := http.Head(url)
if err != nil {
fmt.Println(err)
}
}
выход:
7.9454545s
3- Вывод этого кода:
8.6294936s