Browse Source

Add the Update benchmark

Rob Figueiredo 12 years ago
parent
commit
8af28ed3ee

+ 35 - 0
revel/src/benchmark/app/controllers/app.go

@@ -28,6 +28,7 @@ type Fortune struct {
 const (
 const (
 	WorldSelect        = "SELECT id,randomNumber FROM World where id=?"
 	WorldSelect        = "SELECT id,randomNumber FROM World where id=?"
 	FortuneSelect      = "SELECT id,message FROM Fortune"
 	FortuneSelect      = "SELECT id,message FROM Fortune"
+	WorldUpdate        = "UPDATE World SET randomNumber = ? where id = ?"
 	WorldRowCount      = 10000
 	WorldRowCount      = 10000
 	MaxConnectionCount = 100
 	MaxConnectionCount = 100
 )
 )
@@ -35,6 +36,7 @@ const (
 var (
 var (
 	worldStatement   *sql.Stmt
 	worldStatement   *sql.Stmt
 	fortuneStatement *sql.Stmt
 	fortuneStatement *sql.Stmt
+	updateStatement  *sql.Stmt
 )
 )
 
 
 func init() {
 func init() {
@@ -49,6 +51,9 @@ func init() {
 		if fortuneStatement, err = db.Db.Prepare(FortuneSelect); err != nil {
 		if fortuneStatement, err = db.Db.Prepare(FortuneSelect); err != nil {
 			revel.ERROR.Fatalln(err)
 			revel.ERROR.Fatalln(err)
 		}
 		}
+		if updateStatement, err = db.Db.Prepare(WorldUpdate); err != nil {
+			revel.ERROR.Fatalln(err)
+		}
 	})
 	})
 }
 }
 
 
@@ -85,6 +90,36 @@ func (c App) Db(queries int) revel.Result {
 	return c.RenderJson(ww)
 	return c.RenderJson(ww)
 }
 }
 
 
+func (c App) Update(queries int) revel.Result {
+	rowNum := rand.Intn(WorldRowCount) + 1
+	if queries <= 1 {
+		var w World
+		worldStatement.QueryRow(rowNum).Scan(&w.Id, &w.RandomNumber)
+		w.RandomNumber = uint16(rand.Intn(WorldRowCount) + 1)
+		updateStatement.Exec(w.RandomNumber, w.Id)
+		return c.RenderJson(&w)
+	}
+
+	var (
+		ww = make([]World, queries)
+		wg sync.WaitGroup
+	)
+	wg.Add(queries)
+	for i := 0; i < queries; i++ {
+		go func(i int) {
+			err := worldStatement.QueryRow(rowNum).Scan(&ww[i].Id, &ww[i].RandomNumber)
+			if err != nil {
+				revel.ERROR.Fatalf("Error scanning world row: %v", err)
+			}
+			ww[i].RandomNumber = uint16(rand.Intn(WorldRowCount) + 1)
+			updateStatement.Exec(ww[i].RandomNumber, ww[i].Id)
+			wg.Done()
+		}(i)
+	}
+	wg.Wait()
+	return c.RenderJson(ww)
+}
+
 func (c App) Fortune() revel.Result {
 func (c App) Fortune() revel.Result {
 	fortunes := make([]*Fortune, 0, 16)
 	fortunes := make([]*Fortune, 0, 16)
 
 

+ 2 - 2
revel/src/benchmark/conf/app.conf

@@ -24,5 +24,5 @@ watch=false
 
 
 log.trace.output = off
 log.trace.output = off
 log.info.output  = off
 log.info.output  = off
-log.warn.output  = %(app.name)s.log
-log.error.output = %(app.name)s.log
+log.warn.output  = off
+log.error.output = off

+ 1 - 0
revel/src/benchmark/conf/routes

@@ -5,3 +5,4 @@
 GET     /db                                     App.Db
 GET     /db                                     App.Db
 GET     /json                                   App.Json
 GET     /json                                   App.Json
 GET     /fortune                                App.Fortune
 GET     /fortune                                App.Fortune
+GET     /update                                 App.Update