初めまして。エンジニア新卒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

fasthttp

fasthttprouter

400/s
net/http

fasthttp

fasthttprouter

500/s
net/http

fasthttp

fasthttprouter

まとめ
今回の検証条件では、fasthttpを利用しても大きな速度の変化を確認することはできませんでした。
ただ、より大きな負荷をかけるなど別の検証条件ではまた違った結果が出てくるかもしれません。
また、速度が遅くならないのであれば、fasthttp単体より、fasthttprouterと組み合わせて利用した方が、シンプルなコードが書けるのではないかと思いました。
golangは書いていて楽しいですし、盛り上がってる言語なので、
引き続き勉強していきたいと思います。