Skip to content

Commit b730f13

Browse files
committed
add tango
1 parent 11a0bed commit b730f13

File tree

6 files changed

+110
-0
lines changed

6 files changed

+110
-0
lines changed

bench_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,12 @@ func benchRoutes(b *testing.B, router http.Handler, routes []route) {
6565
// Micro Benchmarks
6666

6767
// Route with Param (no write)
68+
func BenchmarkTango_Param(b *testing.B) {
69+
router := loadTangoSingle("GET", "/user/:name", tangoHandler)
70+
71+
r, _ := http.NewRequest("GET", "/user/gordon", nil)
72+
benchRequest(b, router, r)
73+
}
6874
func BenchmarkBeego_Param(b *testing.B) {
6975
router := loadBeegoSingle("GET", "/user/:name", beegoHandler)
7076

@@ -187,6 +193,12 @@ const fiveColon = "/:a/:b/:c/:d/:e"
187193
const fiveBrace = "/{a}/{b}/{c}/{d}/{e}"
188194
const fiveRoute = "/test/test/test/test/test"
189195

196+
func BenchmarkTango_Param5(b *testing.B) {
197+
router := loadTangoSingle("GET", fiveColon, tangoHandler)
198+
199+
r, _ := http.NewRequest("GET", fiveRoute, nil)
200+
benchRequest(b, router, r)
201+
}
190202
func BenchmarkBeego_Param5(b *testing.B) {
191203
router := loadBeegoSingle("GET", fiveColon, beegoHandler)
192204

@@ -309,6 +321,12 @@ const twentyColon = "/:a/:b/:c/:d/:e/:f/:g/:h/:i/:j/:k/:l/:m/:n/:o/:p/:q/:r/:s/:
309321
const twentyBrace = "/{a}/{b}/{c}/{d}/{e}/{f}/{g}/{h}/{i}/{j}/{k}/{l}/{m}/{n}/{o}/{p}/{q}/{r}/{s}/{t}"
310322
const twentyRoute = "/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t"
311323

324+
func BenchmarkTango_Param20(b *testing.B) {
325+
router := loadTangoSingle("GET", twentyColon, tangoHandler)
326+
327+
r, _ := http.NewRequest("GET", twentyRoute, nil)
328+
benchRequest(b, router, r)
329+
}
312330
func BenchmarkBeego_Param20(b *testing.B) {
313331
router := loadBeegoSingle("GET", twentyColon, beegoHandler)
314332

@@ -427,6 +445,12 @@ func BenchmarkTraffic_Param20(b *testing.B) {
427445
}
428446

429447
// Route with Param and write
448+
func BenchmarkTango_ParamWrite(b *testing.B) {
449+
router := loadTangoSingle("GET", "/user/:name", tangoHandlerWrite)
450+
451+
r, _ := http.NewRequest("GET", "/user/gordon", nil)
452+
benchRequest(b, router, r)
453+
}
430454
func BenchmarkBeego_ParamWrite(b *testing.B) {
431455
router := loadBeegoSingle("GET", "/user/:name", beegoHandlerWrite)
432456

github_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ var githubAPI = []route{
274274
}
275275

276276
var (
277+
githubTango http.Handler
277278
githubBeego http.Handler
278279
githubBone http.Handler
279280
githubDenco http.Handler
@@ -297,6 +298,9 @@ var (
297298
func init() {
298299
println("#GithubAPI Routes:", len(githubAPI))
299300

301+
calcMem("Tango", func() {
302+
githubTango = loadTango(githubAPI)
303+
})
300304
calcMem("Beego", func() {
301305
githubBeego = loadBeego(githubAPI)
302306
})
@@ -356,6 +360,10 @@ func init() {
356360
}
357361

358362
// Static
363+
func BenchmarkTango_GithubStatic(b *testing.B) {
364+
req, _ := http.NewRequest("GET", "/user/repos", nil)
365+
benchRequest(b, githubTango, req)
366+
}
359367
func BenchmarkBeego_GithubStatic(b *testing.B) {
360368
req, _ := http.NewRequest("GET", "/user/repos", nil)
361369
benchRequest(b, githubBeego, req)
@@ -430,6 +438,10 @@ func BenchmarkTraffic_GithubStatic(b *testing.B) {
430438
}
431439

432440
// Param
441+
func BenchmarkTango_GithubParam(b *testing.B) {
442+
req, _ := http.NewRequest("GET", "/repos/julienschmidt/httprouter/stargazers", nil)
443+
benchRequest(b, githubTango, req)
444+
}
433445
func BenchmarkBeego_GithubParam(b *testing.B) {
434446
req, _ := http.NewRequest("GET", "/repos/julienschmidt/httprouter/stargazers", nil)
435447
benchRequest(b, githubBeego, req)
@@ -504,6 +516,9 @@ func BenchmarkTraffic_GithubParam(b *testing.B) {
504516
}
505517

506518
// All routes
519+
func BenchmarkTango_GithubAll(b *testing.B) {
520+
benchRoutes(b, githubTango, githubAPI)
521+
}
507522
func BenchmarkBeego_GithubAll(b *testing.B) {
508523
benchRoutes(b, githubBeego, githubAPI)
509524
}

gplus_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ var gplusAPI = []route{
3636
}
3737

3838
var (
39+
gplusTango http.Handler
3940
gplusBeego http.Handler
4041
gplusBone http.Handler
4142
gplusDenco http.Handler
@@ -59,6 +60,9 @@ var (
5960
func init() {
6061
println("#GPlusAPI Routes:", len(gplusAPI))
6162

63+
calcMem("Tango", func() {
64+
gplusTango = loadTango(gplusAPI)
65+
})
6266
calcMem("Beego", func() {
6367
gplusBeego = loadBeego(gplusAPI)
6468
})
@@ -118,6 +122,10 @@ func init() {
118122
}
119123

120124
// Static
125+
func BenchmarkTango_GPlusStatic(b *testing.B) {
126+
req, _ := http.NewRequest("GET", "/people", nil)
127+
benchRequest(b, gplusTango, req)
128+
}
121129
func BenchmarkBeego_GPlusStatic(b *testing.B) {
122130
req, _ := http.NewRequest("GET", "/people", nil)
123131
benchRequest(b, gplusBeego, req)
@@ -192,6 +200,10 @@ func BenchmarkTraffic_GPlusStatic(b *testing.B) {
192200
}
193201

194202
// One Param
203+
func BenchmarkTango_GPlusParam(b *testing.B) {
204+
req, _ := http.NewRequest("GET", "/people/118051310819094153327", nil)
205+
benchRequest(b, gplusTango, req)
206+
}
195207
func BenchmarkBeego_GPlusParam(b *testing.B) {
196208
req, _ := http.NewRequest("GET", "/people/118051310819094153327", nil)
197209
benchRequest(b, gplusBeego, req)
@@ -266,6 +278,10 @@ func BenchmarkTraffic_GPlusParam(b *testing.B) {
266278
}
267279

268280
// Two Params
281+
func BenchmarkTango_GPlus2Params(b *testing.B) {
282+
req, _ := http.NewRequest("GET", "/people/118051310819094153327/activities/123456789", nil)
283+
benchRequest(b, gplusTango, req)
284+
}
269285
func BenchmarkBeego_GPlus2Params(b *testing.B) {
270286
req, _ := http.NewRequest("GET", "/people/118051310819094153327/activities/123456789", nil)
271287
benchRequest(b, gplusBeego, req)
@@ -340,6 +356,9 @@ func BenchmarkTraffic_GPlus2Params(b *testing.B) {
340356
}
341357

342358
// All Routes
359+
func BenchmarkTango_GPlusAll(b *testing.B) {
360+
benchRoutes(b, gplusTango, gplusAPI)
361+
}
343362
func BenchmarkBeego_GPlusAll(b *testing.B) {
344363
benchRoutes(b, gplusBeego, gplusAPI)
345364
}

parse_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ var parseAPI = []route{
5656
}
5757

5858
var (
59+
parseTango http.Handler
5960
parseBeego http.Handler
6061
parseBone http.Handler
6162
parseDenco http.Handler
@@ -79,6 +80,9 @@ var (
7980
func init() {
8081
println("#ParseAPI Routes:", len(parseAPI))
8182

83+
calcMem("Tango", func() {
84+
parseTango = loadTango(parseAPI)
85+
})
8286
calcMem("Beego", func() {
8387
parseBeego = loadBeego(parseAPI)
8488
})
@@ -138,6 +142,10 @@ func init() {
138142
}
139143

140144
// Static
145+
func BenchmarkTango_ParseStatic(b *testing.B) {
146+
req, _ := http.NewRequest("GET", "/1/users", nil)
147+
benchRequest(b, parseTango, req)
148+
}
141149
func BenchmarkBeego_ParseStatic(b *testing.B) {
142150
req, _ := http.NewRequest("GET", "/1/users", nil)
143151
benchRequest(b, parseBeego, req)
@@ -212,6 +220,10 @@ func BenchmarkTraffic_ParseStatic(b *testing.B) {
212220
}
213221

214222
// One Param
223+
func BenchmarkTango_ParseParam(b *testing.B) {
224+
req, _ := http.NewRequest("GET", "/1/classes/go", nil)
225+
benchRequest(b, parseTango, req)
226+
}
215227
func BenchmarkBeego_ParseParam(b *testing.B) {
216228
req, _ := http.NewRequest("GET", "/1/classes/go", nil)
217229
benchRequest(b, parseBeego, req)
@@ -286,6 +298,10 @@ func BenchmarkTraffic_ParseParam(b *testing.B) {
286298
}
287299

288300
// Two Params
301+
func BenchmarkTango_Parse2Params(b *testing.B) {
302+
req, _ := http.NewRequest("GET", "/1/classes/go/123456789", nil)
303+
benchRequest(b, parseTango, req)
304+
}
289305
func BenchmarkBeego_Parse2Params(b *testing.B) {
290306
req, _ := http.NewRequest("GET", "/1/classes/go/123456789", nil)
291307
benchRequest(b, parseBeego, req)
@@ -360,6 +376,9 @@ func BenchmarkTraffic_Parse2Params(b *testing.B) {
360376
}
361377

362378
// All Routes
379+
func BenchmarkTango_ParseAll(b *testing.B) {
380+
benchRoutes(b, parseTango, parseAPI)
381+
}
363382
func BenchmarkBeego_ParseAll(b *testing.B) {
364383
benchRoutes(b, parseBeego, parseAPI)
365384
}

routers.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"runtime"
1515

1616
"github.com/ant0ine/go-json-rest/rest"
17+
"github.com/lunny/tango"
1718
"github.com/astaxie/beego"
1819
"github.com/astaxie/beego/context"
1920
"github.com/bmizerany/pat"
@@ -68,6 +69,7 @@ func init() {
6869
log.SetOutput(new(mockResponseWriter))
6970
nullLogger = log.New(new(mockResponseWriter), "", 0)
7071

72+
initTango()
7173
initBeego()
7274
initGin()
7375
initMartini()
@@ -78,6 +80,16 @@ func init() {
7880
// Common
7981
func httpHandlerFunc(w http.ResponseWriter, r *http.Request) {}
8082

83+
func tangoHandler(ctx *tango.Context) {
84+
}
85+
func tangoHandlerWrite(ctx *tango.Context) {
86+
ctx.Write([]byte(ctx.Params().Get(":name")))
87+
}
88+
89+
func initTango() {
90+
tango.Env = tango.Prod
91+
}
92+
8193
// beego
8294
func beegoHandler(ctx *context.Context) {}
8395

@@ -90,6 +102,20 @@ func initBeego() {
90102
beego.BeeLogger.Close()
91103
}
92104

105+
func loadTango(routes []route) http.Handler {
106+
tg := tango.New()
107+
for _, route := range routes {
108+
tg.Route([]string{route.method}, route.path, tangoHandler)
109+
}
110+
return tg
111+
}
112+
113+
func loadTangoSingle(method, path string, handler func(*tango.Context)) http.Handler {
114+
tg := tango.New()
115+
tg.Route([]string{method}, path, handler)
116+
return tg
117+
}
118+
93119
func loadBeego(routes []route) http.Handler {
94120
re := regexp.MustCompile(":([^/]*)")
95121
app := beego.NewControllerRegister()

static_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ var staticRoutes = []route{
172172
var (
173173
staticHttpServeMux http.Handler
174174

175+
staticTango http.Handler
175176
staticBeego http.Handler
176177
staticBone http.Handler
177178
staticDenco http.Handler
@@ -203,6 +204,9 @@ func init() {
203204
staticHttpServeMux = serveMux
204205
})
205206

207+
calcMem("Tango", func() {
208+
staticTango = loadTango(staticRoutes)
209+
})
206210
calcMem("Beego", func() {
207211
staticBeego = loadBeego(staticRoutes)
208212
})
@@ -265,6 +269,9 @@ func init() {
265269
func BenchmarkHttpServeMux_StaticAll(b *testing.B) {
266270
benchRoutes(b, staticHttpServeMux, staticRoutes)
267271
}
272+
func BenchmarkTango_StaticAll(b *testing.B) {
273+
benchRoutes(b, staticTango, staticRoutes)
274+
}
268275
func BenchmarkBeego_StaticAll(b *testing.B) {
269276
benchRoutes(b, staticBeego, staticRoutes)
270277
}

0 commit comments

Comments
 (0)