3

我正在使用fasthttp包构建一个 Rest API。我有一条用于测量性能的测试路线:

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 中调用这条路由指向的函数需要这么长时间?

4

1 回答 1

4

对我来说,100000 只需要 7.9454545 秒http.Head(每 79.454545us http.Head,运行这 1 和 2 个代码时,只有 2 个核心 CPU 负载为 77%)。

您不需要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
于 2016-10-06T04:33:26.517 回答