Open5
Potetoの水溜まり

PotetoはGolangのwebAPIフレームワーク
こんな感じで良い感じにroutingできる。
func main() {
p := poteto.New()
// Leaf >= 0.21.0
p.Leaf("/users", func(userApi poteto.Leaf) {
userApi.Register(middleware.CamaraWithConfig(middleware.DefaultCamaraConfig))
userApi.GET("/", controller.UserHandler)
userApi.GET("/:name", controller.UserIdHandler)
})
p.Run(":8000")
}
routingについての詳しい話はこちら

高速化処理を入れる前の最初のベンチマークテストの結果が出ました。
言語パワーだけでpythonのフレームワークには勝ちました笑。次はgolangでも上位を狙いたいです

v0.23.4
アップデート
ルーターのパフォーマンスチューニングを行いました!!
パフォーマンスが2倍に
プルリク
変更内容
元々検索の際に、例えば
params := strings.Split(path, "/")
for _, param := range params {
...
}
のように配列を作ってループを回していました。この処理を以下のように毎回インデックスから取得するように変えました。
for {
id := strings.Index(rightPath, "/")
if id < 0 {
param = rightPath
} else {
param = rightPath[:id]
rightPath = rightPath[(id + 1):]
}
...
}
要因
これはstrings.Split()
が内部でループを挟むため、計算量が2Nになっていたことが原因です。
func genSplit(s, sep string, sepSave, n int) []string {
if n == 0 {
return nil
}
if sep == "" {
return explode(s, n)
}
if n < 0 {
n = Count(s, sep) + 1
}
if n > len(s)+1 {
n = len(s) + 1
}
a := make([]string, n)
n--
i := 0
for i < n {
m := Index(s, sep)
if m < 0 {
break
}
a[i] = s[:m+sepSave]
s = s[m+len(sep):]
i++
}
a[i] = s
return a[:i+1]
}
競プロとかではあまりNと2Nを区別している印象はないですが、webフレームワークはこれだけで捌けるリクエスト数が2倍になるので、大きな差があります

v0.24.0
アップデート
主な変更
-
ctx.DebugParam()
を追加しました。
PathParameterとQueryParameterを取得して、デバッグやログに吐き出す用のログを作ってくれます。
// case
// PathParam: player_id=2, user_id=1
// QueryParam: user_id=1
if debugParam, ok := ctx.DebugParam(); ok {
fmt.Println(debugParam) // => {"path":{"player_id":"2","user_id":"1"},"query":{"user_id":"1"}}
}
- urlの最後以外のpathParameterを設定(取得)できるようになりました
https://github.com/poteto0/poteto/pull/122

RELEASE: Poteto@v1.4.0
Poteto.Play
サーバーを立ち上げることなく、テストを書くことが可能になりました
func main() {
p := poteto.New()
p.GET("/users", func(ctx poteto.Context) error {
return ctx.JSON(http.StatusOK, map[string]string{
"id": "1",
"name": "tester",
})
})
res := p.Play(http.MethodGet, "/users")
resBodyStr := res.Body.String
// => {"id":"1","name":"tester"}
}
poteto/response
fullfill RequestController
poteto/response
はRequestController
を作るためのインターフェイスを満たしました。
簡単にRequestController
に乗せられます
w := httptest.NewRecorder()
res := NewResponse(w)
rc := http.NewResponseController(res)
rc.SetWriteDeadline(time.Now().Add(5 * time.Second))
res.Write([]byte("done"))