prefer rwmutex, add parallel benchmark

export-buildtree
Muhammed Efe Cetin 2024-06-29 01:55:54 +03:00
parent ae61c32860
commit 0cf6349204
No known key found for this signature in database
GPG Key ID: 0AA4D45CBAA86F73
2 changed files with 31 additions and 3 deletions

View File

@ -146,7 +146,7 @@ func (app *App) nextCustom(c CustomCtx) (bool, error) { //nolint: unparam // boo
} }
func (app *App) next(c *DefaultCtx) (bool, error) { func (app *App) next(c *DefaultCtx) (bool, error) {
app.mutex.Lock() app.mutex.RLock()
// Get stack length // Get stack length
tree, ok := app.treeStack[c.methodINT][c.treePath] tree, ok := app.treeStack[c.methodINT][c.treePath]
@ -154,7 +154,7 @@ func (app *App) next(c *DefaultCtx) (bool, error) {
tree = app.treeStack[c.methodINT][""] tree = app.treeStack[c.methodINT][""]
} }
lenTree := len(tree) - 1 lenTree := len(tree) - 1
app.mutex.Unlock() app.mutex.RUnlock()
// Loop over the route stack starting from previous index // Loop over the route stack starting from previous index
for c.indexRoute < lenTree { for c.indexRoute < lenTree {
@ -381,7 +381,7 @@ func (app *App) addRoute(method string, route *Route, isMounted ...bool) {
app.mutex.Lock() app.mutex.Lock()
defer app.mutex.Unlock() defer app.mutex.Unlock()
fmt.Printf("addRoute: method: %s, route: %v, isMounted: %v\n", method, route, isMounted) //fmt.Printf("addRoute: method: %s, route: %v, isMounted: %v\n", method, route, isMounted)
// Check mounted routes // Check mounted routes
var mounted bool var mounted bool

View File

@ -595,6 +595,34 @@ func Benchmark_Router_Next(b *testing.B) {
require.Equal(b, 4, c.indexRoute) require.Equal(b, 4, c.indexRoute)
} }
func Benchmark_Router_Next_Parallel(b *testing.B) {
app := New()
registerDummyRoutes(app)
app.startupProcess()
request := &fasthttp.RequestCtx{}
request.Request.Header.SetMethod("DELETE")
request.URI().SetPath("/user/keys/1337")
var res bool
var err error
c := app.AcquireCtx(request).(*DefaultCtx) //nolint:errcheck, forcetypeassert // not needed
b.ResetTimer()
b.RunParallel(func(p *testing.PB) {
for p.Next() {
c.indexRoute = -1
res, err = app.next(c)
}
})
require.NoError(b, err)
require.True(b, res)
require.Equal(b, 4, c.indexRoute)
}
// go test -v ./... -run=^$ -bench=Benchmark_Route_Match -benchmem -count=4 // go test -v ./... -run=^$ -bench=Benchmark_Route_Match -benchmem -count=4
func Benchmark_Route_Match(b *testing.B) { func Benchmark_Route_Match(b *testing.B) {
var match bool var match bool