@@ -3,7 +3,10 @@ package gorethink
33import (
44 "encoding/json"
55 "flag"
6+ "math/rand"
67 "os"
8+ "runtime"
9+ "sync"
710 "testing"
811 "time"
912
@@ -203,3 +206,181 @@ var str T = T{
203206 },
204207 },
205208}
209+
210+ func (s * RethinkSuite ) BenchmarkExpr (c * test.C ) {
211+ for i := 0 ; i < c .N ; i ++ {
212+ // Test query
213+ query := Expr (true )
214+ err := query .Exec (sess )
215+ c .Assert (err , test .IsNil )
216+ }
217+ }
218+
219+ func (s * RethinkSuite ) BenchmarkNoReplyExpr (c * test.C ) {
220+ for i := 0 ; i < c .N ; i ++ {
221+ // Test query
222+ query := Expr (true )
223+ err := query .Exec (sess , RunOpts {NoReply : true })
224+ c .Assert (err , test .IsNil )
225+ }
226+ }
227+
228+ func (s * RethinkSuite ) BenchmarkGet (c * test.C ) {
229+ // Ensure table + database exist
230+ DbCreate ("test" ).RunWrite (sess )
231+ Db ("test" ).TableCreate ("TestMany" ).RunWrite (sess )
232+ Db ("test" ).Table ("TestMany" ).Delete ().RunWrite (sess )
233+
234+ // Insert rows
235+ data := []interface {}{}
236+ for i := 0 ; i < 100 ; i ++ {
237+ data = append (data , map [string ]interface {}{
238+ "id" : i ,
239+ })
240+ }
241+ Db ("test" ).Table ("TestMany" ).Insert (data ).Run (sess )
242+
243+ for i := 0 ; i < c .N ; i ++ {
244+ n := rand .Intn (100 )
245+
246+ // Test query
247+ var response interface {}
248+ query := Db ("test" ).Table ("TestMany" ).Get (n )
249+ res , err := query .Run (sess )
250+ c .Assert (err , test .IsNil )
251+
252+ err = res .One (& response )
253+
254+ c .Assert (err , test .IsNil )
255+ c .Assert (response , JsonEquals , map [string ]interface {}{"id" : n })
256+ }
257+ }
258+
259+ func (s * RethinkSuite ) BenchmarkGetStruct (c * test.C ) {
260+ // Ensure table + database exist
261+ DbCreate ("test" ).RunWrite (sess )
262+ Db ("test" ).TableCreate ("TestMany" ).RunWrite (sess )
263+ Db ("test" ).Table ("TestMany" ).Delete ().RunWrite (sess )
264+
265+ // Insert rows
266+ data := []interface {}{}
267+ for i := 0 ; i < 100 ; i ++ {
268+ data = append (data , map [string ]interface {}{
269+ "id" : i ,
270+ "name" : "Object 1" ,
271+ "Attrs" : []interface {}{map [string ]interface {}{
272+ "Name" : "attr 1" ,
273+ "Value" : "value 1" ,
274+ }},
275+ })
276+ }
277+ Db ("test" ).Table ("TestMany" ).Insert (data ).Run (sess )
278+
279+ for i := 0 ; i < c .N ; i ++ {
280+ n := rand .Intn (100 )
281+
282+ // Test query
283+ var resObj object
284+ query := Db ("test" ).Table ("TestMany" ).Get (n )
285+ res , err := query .Run (sess )
286+ c .Assert (err , test .IsNil )
287+
288+ err = res .One (& resObj )
289+
290+ c .Assert (err , test .IsNil )
291+ }
292+ }
293+
294+ func (s * RethinkSuite ) BenchmarkSelectMany (c * test.C ) {
295+ // Ensure table + database exist
296+ DbCreate ("test" ).RunWrite (sess )
297+ Db ("test" ).TableCreate ("TestMany" ).RunWrite (sess )
298+ Db ("test" ).Table ("TestMany" ).Delete ().RunWrite (sess )
299+
300+ // Insert rows
301+ data := []interface {}{}
302+ for i := 0 ; i < 100 ; i ++ {
303+ data = append (data , map [string ]interface {}{
304+ "id" : i ,
305+ })
306+ }
307+ Db ("test" ).Table ("TestMany" ).Insert (data ).Run (sess )
308+
309+ for i := 0 ; i < c .N ; i ++ {
310+ // Test query
311+ res , err := Db ("test" ).Table ("TestMany" ).Run (sess )
312+ c .Assert (err , test .IsNil )
313+
314+ var response []map [string ]interface {}
315+ err = res .All (& response )
316+
317+ c .Assert (err , test .IsNil )
318+ c .Assert (response , test .HasLen , 100 )
319+ }
320+ }
321+
322+ func (s * RethinkSuite ) BenchmarkSelectManyStruct (c * test.C ) {
323+ // Ensure table + database exist
324+ DbCreate ("test" ).RunWrite (sess )
325+ Db ("test" ).TableCreate ("TestMany" ).RunWrite (sess )
326+ Db ("test" ).Table ("TestMany" ).Delete ().RunWrite (sess )
327+
328+ // Insert rows
329+ data := []interface {}{}
330+ for i := 0 ; i < 100 ; i ++ {
331+ data = append (data , map [string ]interface {}{
332+ "id" : i ,
333+ "name" : "Object 1" ,
334+ "Attrs" : []interface {}{map [string ]interface {}{
335+ "Name" : "attr 1" ,
336+ "Value" : "value 1" ,
337+ }},
338+ })
339+ }
340+ Db ("test" ).Table ("TestMany" ).Insert (data ).Run (sess )
341+
342+ for i := 0 ; i < c .N ; i ++ {
343+ // Test query
344+ res , err := Db ("test" ).Table ("TestMany" ).Run (sess )
345+ c .Assert (err , test .IsNil )
346+
347+ var response []object
348+ err = res .All (& response )
349+
350+ c .Assert (err , test .IsNil )
351+ c .Assert (response , test .HasLen , 100 )
352+ }
353+ }
354+
355+ func doConcurrentTest (c * test.C , ct func ()) {
356+ maxProcs , numReqs := 1 , 150
357+ if testing .Short () {
358+ maxProcs , numReqs = 4 , 50
359+ }
360+ defer runtime .GOMAXPROCS (runtime .GOMAXPROCS (maxProcs ))
361+
362+ var wg sync.WaitGroup
363+ wg .Add (numReqs )
364+
365+ reqs := make (chan bool )
366+ defer close (reqs )
367+
368+ for i := 0 ; i < maxProcs * 2 ; i ++ {
369+ go func () {
370+ for _ = range reqs {
371+ ct ()
372+ if c .Failed () {
373+ wg .Done ()
374+ continue
375+ }
376+ wg .Done ()
377+ }
378+ }()
379+ }
380+
381+ for i := 0 ; i < numReqs ; i ++ {
382+ reqs <- true
383+ }
384+
385+ wg .Wait ()
386+ }
0 commit comments