初めまして。エンジニア新卒2年目の武田です。

趣味でGo言語を勉強しています。Gopher君、可愛いですよね!!
好き過ぎて、Gopher君ステッカーが日本ではなかなか手に入らなかったので、海外サイト(Unixstickers)で購入しちゃいました笑

さて、本題です。
今回は少し前に話題になったvalyala/fasthttpライブラリを触ってみました。

valyla/fasthttpとは

golangでHTTP通信を行うためのライブラリです。
golangは標準パッケージにnet/httpがあるのですが、fasthttpを代わりに利用すると速度がかなり早くなるみたいです。公式のベンチマークテストだと、10倍高い性能が出たとか。
valyla/fasthttp

検証用コード

検証用にnet/httpとfasthttpのそれぞれで、1000万回数値をカウントしていく簡単なコードを書きました。

また、fasthttpで使えるサードパーティのリクエストルーターライブラリ(buaazp/fasthttprouter)があるので、それを利用したコードも書きました。

net/http

package main

import (
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    sum:= 1
    for sum < 10000000 {
        sum += 1
    }
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

fasthttp

package main

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

func handler(ctx *fasthttp.RequestCtx) {
    sum:= 1
    for sum < 10000000 {
        sum += 1
    }
}

func main() {
    requestHandler := func(ctx *fasthttp.RequestCtx) {
        switch string(ctx.Path()) {
        case "/":
            handler(ctx)
        default:
            ctx.Error("Unsupported path", fasthttp.StatusNotFound)
        }
    }
    fasthttp.ListenAndServe(":8081", requestHandler)
}

fasthttprouter

package main

import (
    "github.com/valyala/fasthttp"
    "github.com/buaazp/fasthttprouter"
)

func handler(ctx *fasthttp.RequestCtx, _ fasthttprouter.Params) {
    sum:= 1
    for sum < 10000000 {
        sum += 1
    }
}

func main() {
    router := fasthttprouter.New()
    router.GET("/", handler)
    fasthttp.ListenAndServe(":8082", router.Handler)
}

検証方法

折角golangの検証を行うので、検証用のツールはgolangで作られたhttp負荷テストツールのvegetaを利用します。
tsenart/vegeta

vegetaは簡単に利用できます。
まず、負荷をかけるページのurlをファイルに記述します。

GET http://localhost:8080

次に、以下のようなコマンドを書き、対象ページにベジータアタック!!(負荷)をかけます。
このコマンドでは、対象ページに秒間100アクセスを10秒間行っています。

vegeta attack -rate=100 -duration=10s -targets=target.txt > result.txt

以下のコマンドで結果を表示します。

vegeta report -inputs=result.txt

この要領で、今回の検証では秒間300、400、500アクセスで10秒間負荷をかけました。

検証環境
OS: OS X Lion v10.8.1, メモリ: 4GB, CPU: Core i5, Go: 1.5.1

検証結果

結論から言うと、各アクセス条件で遅延時間(Latencies)の平均(mean)を比較してみても、多少誤差がある程度でした・・・

300/s

net/http

net_300

fasthttp

fast_300

fasthttprouter

fastrouter_300

400/s

net/http

net_400

fasthttp

fast_400

fasthttprouter

fastrouter_400

500/s

net/http

net_500

fasthttp

fast_500

fasthttprouter

fastrouter_500

まとめ

今回の検証条件では、fasthttpを利用しても大きな速度の変化を確認することはできませんでした。
ただ、より大きな負荷をかけるなど別の検証条件ではまた違った結果が出てくるかもしれません。

また、速度が遅くならないのであれば、fasthttp単体より、fasthttprouterと組み合わせて利用した方が、シンプルなコードが書けるのではないかと思いました。

golangは書いていて楽しいですし、盛り上がってる言語なので、
引き続き勉強していきたいと思います。

Join Us !

ウエディングパークでは、一緒に働く仲間を募集しています!
ご興味ある方は、お気軽にお問合せください(カジュアル面談から可)

採用情報を見る