From 40194a6781e3ce156fc8b1dd7d76d190e218d572 Mon Sep 17 00:00:00 2001
From: Pawan Rawal <pawan0201@gmail.com>
Date: Thu, 12 May 2016 12:18:07 +0530
Subject: [PATCH] Benchmarking

1. Exporting query and result byte slices inside SubGraph so that they are
written to file when we write the SubGraph to file after gobencoding it.
2. Added benchmark test to benchmark ToJSON and ToProtocolBuffer methods for
actors and directors query for 10,100 and 1000 entities in the result.
---
 query/benchmark/README.txt        |  36 ++++++++++++
 query/benchmark/actors10.txt      | Bin 0 -> 1450 bytes
 query/benchmark/actors100.txt     | Bin 0 -> 7257 bytes
 query/benchmark/actors1000.txt    | Bin 0 -> 57193 bytes
 query/benchmark/directors10.txt   | Bin 0 -> 1350 bytes
 query/benchmark/directors100.txt  | Bin 0 -> 4253 bytes
 query/benchmark/directors1000.txt | Bin 0 -> 17901 bytes
 query/query.go                    |  45 +++++++-------
 query/query_test.go               |  94 ++++++++++++++++++++++++++----
 9 files changed, 141 insertions(+), 34 deletions(-)
 create mode 100644 query/benchmark/README.txt
 create mode 100644 query/benchmark/actors10.txt
 create mode 100644 query/benchmark/actors100.txt
 create mode 100644 query/benchmark/actors1000.txt
 create mode 100644 query/benchmark/directors10.txt
 create mode 100644 query/benchmark/directors100.txt
 create mode 100644 query/benchmark/directors1000.txt

diff --git a/query/benchmark/README.txt b/query/benchmark/README.txt
new file mode 100644
index 00000000..64f152a9
--- /dev/null
+++ b/query/benchmark/README.txt
@@ -0,0 +1,36 @@
+The files in this folder contain gobencoded data for a processed SubGraph for
+the following queries. The number at the end(10,100,1000) of the files 
+represents the number of entities in the results of the query.
+
+Actors query
+{
+        me(_xid_:m.08624h) {
+         type.object.name.en
+         film.actor.film {
+             film.performance.film {
+                 type.object.name.en
+             }
+         }
+    }
+}
+
+Directors query
+{
+        me(_xid_:m.05dxl_) {
+          type.object.name.en
+          film.director.film  {
+                film.film.genre {
+                  type.object.name.en
+                }
+          }
+    }
+}
+
+Benchmarking tests were run for ToJson and ToProtocolBuffer methods. Results
+from the `go test` command are tabulated below.
+
+BenchmarkToJson                500       3939003 ns/op      957723 B/op      16115 allocs/op
+BenchmarkToProtocolBuffer     1000       2288681 ns/op      566287 B/op       7542 allocs/op
+
+We can see that ToProtocolBuffer method allocates less memory and takes lesser
+time than ToJson method.
\ No newline at end of file
diff --git a/query/benchmark/actors10.txt b/query/benchmark/actors10.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7c8e357b4a004f2935c9d18f4df01445020f646a
GIT binary patch
literal 1450
zcmb7E&ubG=5PmOBLX=<{YCupS<RVC2YEh^ciH)FWrLhqNf7MO$)@<4A#@$Ud;KkU3
z;7!Dv&=wCBd+HzH!CNl{y(mSzhzLeJ_y=_R&2AQ-Wn*>2N4}XiGjHC^ym!@mIK+9X
z(ypGf)mDRhUB;6<e#Uieo@P8zvf8H0<4{g(nj?IgDm8SYZVQup3oyCd7Iug4g~^O?
z+J+0tSl)XS<2-x)=Fz*fto+^pF4%-^B^0mAle4yExwAttKH_#-Lb0lIqUI{5+7yZ~
z<HccwO5>MeaWLWxoH5dK;9ze&x99b#-UxU^0LE_w9%=Zed{6Qw9eIcUhroY&o)_!^
z!T*x}u1Rpx?*j^zjxn#R`6+QvcM4GOjHVk+MXkA(tq?^mbH1u2Y|XNps#z1^LgWc=
z4?5u(!Y6>S#ifl`lk20kZwsp*KBlheC#PBO@Vi^pK;CQw^5=mS*y1OmYCvbE_@96k
z-~n(RkoAj@TR;(@JWoqCy3psOFI;Je{FGYPg_FOengva=!!n!i%lpZ8Qq&E#nb*yH
zS+(Kgh{AKpe)%tP-$-^8cVm~hyY)0j`BZfCj&2^Igj^hBM%7JfE#m`QGm2Fj3GJC%
zdhzvmCYyY`eldG&d`Yk`%g&RP;Xq!aD6~c7KtRvEA5on-fF%n561WeX1w!2_ICZKF
zP^ael6`*MjCjyjpB|XVc`*I9CoS<-WXnk#m{aZ;6Cy(qlB|XXCB{`f_#{RrHl$-zY
zA`MH_b*90PuQQovfE~AsaU-f=q?51n1mySq#Qv>MgA$(jpM>e92%a;fQw|fQmy6z<
SsCS3D`b(-{ROP}Kj%@?6vn-<k

literal 0
HcmV?d00001

diff --git a/query/benchmark/actors100.txt b/query/benchmark/actors100.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1913d51d53728b2b3a25f0c1c2033c0309f2a95c
GIT binary patch
literal 7257
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
I{B>~s8)6Y3SpWb4

literal 0
HcmV?d00001

diff --git a/query/benchmark/actors1000.txt b/query/benchmark/actors1000.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e68e12919c6211372b8ad5345ee05ba81f1b99b4
GIT binary patch
literal 57193
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
DB$PO?

literal 0
HcmV?d00001

diff --git a/query/benchmark/directors10.txt b/query/benchmark/directors10.txt
new file mode 100644
index 0000000000000000000000000000000000000000..30626b0ddb0bc0f008d89eace50f25f51aa58dc5
GIT binary patch
literal 1350
zcma)6F>KR76unDa6QQ8cmZ6|ZM4k|;JTP@&040bHK%fjD0jk{Qf}O^8xY$4tO9NvE
zgkWJoLLel>LPtPIObA8>kcz~F7=Wn*V#2&{``V;9&_v(&{=fV8|9|)I&O}Rj&I_l*
z`J>Wm+dS$qu5;~h5J+BRe5B%sUcfaNYmG)n#IR7YomO26k4HDL<WwkRmv6_CS<wkw
z0U%@L=thq7(Q_B}U!rMqBLG|wg#FguMLn+1N#76V@;N>pblbx8=bK_7Fg?o^rtq{w
zJF!&}{{qv12s2>D$j%`@U))<>76*5X17~c&`1!=62>(LtN#0~5Z#7N;uSHRm#DK!|
zIHC?jwlRoN>sW4BKJIwFbQY~EmH{IlYd9^}tUD4}`_d#0be3Xk{JAJRDPYPh@9ePh
z_N9SqU&S-I8XWj_cQn6e>Z854^y$N`tKT1=NbD;^%Z|Qe)lGF$J$E2&$T3L2&4ylu
z?1J<L_+adIs>fVZ{e{pKUSP>?naTtgD}C!<rI@%jD!wb~UE_V<{O1&Jqxq_|T#)%+
z{xf1SK9s>JY)z#)BX6#~Y`!*Tnr|oXmoLxSiT+^e(Gj^@pIE~ZR)TCgG4$w<e=+zF
zF2o?Qr5Jn)d>t|anS?acDyh@d!2zx_OLqDxW=U5EP4*{!{-i%o^&GHj4AlrUzq)Dt
zw?2Ji-@(pSIWWHEt40kFvo+B5xC^Z;!pKHJ)Hn^ST48JFGc4ihVV8%xmqMzy0TB0@
gvE-@2+)0%vy(-kBBq~8Q(y6MROj!Cmk@X0F0B27cn*aa+

literal 0
HcmV?d00001

diff --git a/query/benchmark/directors100.txt b/query/benchmark/directors100.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f490b15013d0b8a59179c33591a9fcb6a0de6485
GIT binary patch
literal 4253
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
S$bV_@_)}Y($0s||8{uDDYXJBF

literal 0
HcmV?d00001

diff --git a/query/benchmark/directors1000.txt b/query/benchmark/directors1000.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8e362902146e92ac589233ea614fbb4c1d019a51
GIT binary patch
literal 17901
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

literal 0
HcmV?d00001

diff --git a/query/query.go b/query/query.go
index 19ea07f8..956fc9cb 100644
--- a/query/query.go
+++ b/query/query.go
@@ -115,8 +115,8 @@ type SubGraph struct {
 	Offset   int
 	Children []*SubGraph
 
-	query  []byte
-	result []byte
+	Query  []byte
+	Result []byte
 }
 
 func mergeInterfaces(i1 interface{}, i2 interface{}) interface{} {
@@ -138,7 +138,7 @@ func mergeInterfaces(i1 interface{}, i2 interface{}) interface{} {
 }
 
 func postTraverse(g *SubGraph) (result map[uint64]interface{}, rerr error) {
-	if len(g.query) == 0 {
+	if len(g.Query) == 0 {
 		return result, nil
 	}
 
@@ -163,13 +163,13 @@ func postTraverse(g *SubGraph) (result map[uint64]interface{}, rerr error) {
 	}
 
 	// Now read the query and results at current node.
-	uo := flatbuffers.GetUOffsetT(g.query)
+	uo := flatbuffers.GetUOffsetT(g.Query)
 	q := new(task.Query)
-	q.Init(g.query, uo)
+	q.Init(g.Query, uo)
 
-	ro := flatbuffers.GetUOffsetT(g.result)
+	ro := flatbuffers.GetUOffsetT(g.Result)
 	r := new(task.Result)
-	r.Init(g.result, ro)
+	r.Init(g.Result, ro)
 
 	if q.UidsLength() != r.UidmatrixLength() {
 		glog.Fatalf("Result uidmatrixlength: %v. Query uidslength: %v",
@@ -277,18 +277,19 @@ func indexOf(uid uint64, q *task.Query) int {
 
 // This method gets the values and children for a subgraph.
 func (g *SubGraph) preTraverse(uid uint64, dst *graph.Node) error {
-	properties := make(map[string]*graph.Value)
+	var properties map[string]*graph.Value
+	properties = make(map[string]*graph.Value)
 	var children []*graph.Node
 
 	// We go through all predicate children of the subgraph.
 	for _, pc := range g.Children {
-		ro := flatbuffers.GetUOffsetT(pc.result)
+		ro := flatbuffers.GetUOffsetT(pc.Result)
 		r := new(task.Result)
-		r.Init(pc.result, ro)
+		r.Init(pc.Result, ro)
 
-		uo := flatbuffers.GetUOffsetT(pc.query)
+		uo := flatbuffers.GetUOffsetT(pc.Query)
 		q := new(task.Query)
-		q.Init(pc.query, uo)
+		q.Init(pc.Query, uo)
 
 		idx := indexOf(uid, q)
 
@@ -354,13 +355,13 @@ func (g *SubGraph) preTraverse(uid uint64, dst *graph.Node) error {
 func (g *SubGraph) ToProtocolBuffer(l *Latency) (n *graph.Node, rerr error) {
 	n = &graph.Node{}
 	n.Attribute = g.Attr
-	if len(g.query) == 0 {
+	if len(g.Query) == 0 {
 		return n, nil
 	}
 
-	ro := flatbuffers.GetUOffsetT(g.result)
+	ro := flatbuffers.GetUOffsetT(g.Result)
 	r := new(task.Result)
-	r.Init(g.result, ro)
+	r.Init(g.Result, ro)
 
 	var ul task.UidList
 	r.Uidmatrix(&ul, 0)
@@ -448,9 +449,9 @@ func newGraph(euid uint64, exid string) (*SubGraph, error) {
 
 	sg := new(SubGraph)
 	sg.Attr = "_root_"
-	sg.result = b.Bytes[b.Head():]
+	sg.Result = b.Bytes[b.Head():]
 	// Also add query for consistency and to allow for ToJson() later.
-	sg.query = createTaskQuery(sg, []uint64{euid})
+	sg.Query = createTaskQuery(sg, []uint64{euid})
 	return sg, nil
 }
 
@@ -535,8 +536,8 @@ func ProcessGraph(sg *SubGraph, rch chan error, td time.Duration) {
 	timeout := time.Now().Add(td)
 
 	var err error
-	if len(sg.query) > 0 && sg.Attr != "_root_" {
-		sg.result, err = worker.ProcessTaskOverNetwork(sg.query)
+	if len(sg.Query) > 0 && sg.Attr != "_root_" {
+		sg.Result, err = worker.ProcessTaskOverNetwork(sg.Query)
 		if err != nil {
 			x.Err(glog, err).Error("While processing task.")
 			rch <- err
@@ -544,9 +545,9 @@ func ProcessGraph(sg *SubGraph, rch chan error, td time.Duration) {
 		}
 	}
 
-	uo := flatbuffers.GetUOffsetT(sg.result)
+	uo := flatbuffers.GetUOffsetT(sg.Result)
 	r := new(task.Result)
-	r.Init(sg.result, uo)
+	r.Init(sg.Result, uo)
 
 	if r.ValuesLength() > 0 {
 		var v task.Value
@@ -589,7 +590,7 @@ func ProcessGraph(sg *SubGraph, rch chan error, td time.Duration) {
 	childchan := make(chan error, len(sg.Children))
 	for i := 0; i < len(sg.Children); i++ {
 		child := sg.Children[i]
-		child.query = createTaskQuery(child, sorted)
+		child.Query = createTaskQuery(child, sorted)
 		go ProcessGraph(child, childchan, timeleft)
 	}
 
diff --git a/query/query_test.go b/query/query_test.go
index 01a676da..5bcd9ad4 100644
--- a/query/query_test.go
+++ b/query/query_test.go
@@ -17,6 +17,8 @@
 package query
 
 import (
+	"bytes"
+	"encoding/gob"
 	"fmt"
 	"io/ioutil"
 	"os"
@@ -63,12 +65,12 @@ func checkName(t *testing.T, r *task.Result, idx int, expected string) {
 
 func checkSingleValue(t *testing.T, child *SubGraph,
 	attr string, value string) {
-	if child.Attr != attr || len(child.result) == 0 {
-		t.Error("Expected attr name with some result")
+	if child.Attr != attr || len(child.Result) == 0 {
+		t.Error("Expected attr name with some.Result")
 	}
-	uo := flatbuffers.GetUOffsetT(child.result)
+	uo := flatbuffers.GetUOffsetT(child.Result)
 	r := new(task.Result)
-	r.Init(child.result, uo)
+	r.Init(child.Result, uo)
 	if r.ValuesLength() != 1 {
 		t.Errorf("Expected value length 1. Got: %v", r.ValuesLength())
 	}
@@ -105,9 +107,9 @@ func TestNewGraph(t *testing.T) {
 
 	worker.Init(ps, nil, 0, 1)
 
-	uo := flatbuffers.GetUOffsetT(sg.result)
+	uo := flatbuffers.GetUOffsetT(sg.Result)
 	r := new(task.Result)
-	r.Init(sg.result, uo)
+	r.Init(sg.Result, uo)
 	if r.UidmatrixLength() != 1 {
 		t.Errorf("Expected length 1. Got: %v", r.UidmatrixLength())
 	}
@@ -230,13 +232,13 @@ func TestProcessGraph(t *testing.T) {
 	if child.Attr != "friend" {
 		t.Errorf("Expected attr friend. Got: %v", child.Attr)
 	}
-	if len(child.result) == 0 {
-		t.Errorf("Expected some result.")
+	if len(child.Result) == 0 {
+		t.Errorf("Expected some.Result.")
 		return
 	}
-	uo := flatbuffers.GetUOffsetT(child.result)
+	uo := flatbuffers.GetUOffsetT(child.Result)
 	r := new(task.Result)
-	r.Init(child.result, uo)
+	r.Init(child.Result, uo)
 
 	if r.UidmatrixLength() != 1 {
 		t.Errorf("Expected 1 matrix. Got: %v", r.UidmatrixLength())
@@ -257,8 +259,8 @@ func TestProcessGraph(t *testing.T) {
 		t.Errorf("Expected attr name")
 	}
 	child = child.Children[0]
-	uo = flatbuffers.GetUOffsetT(child.result)
-	r.Init(child.result, uo)
+	uo = flatbuffers.GetUOffsetT(child.Result)
+	r.Init(child.Result, uo)
 	if r.ValuesLength() != 5 {
 		t.Errorf("Expected 5 names of 5 friends")
 	}
@@ -420,3 +422,71 @@ func TestToProtocolBuffer(t *testing.T) {
 		t.Errorf("Expected 0 children, Got: %v", len(child.Children))
 	}
 }
+
+func benchmarkToJson(file string, b *testing.B) {
+	b.ReportAllocs()
+	var sg SubGraph
+	var l Latency
+
+	f, err := ioutil.ReadFile(file)
+	if err != nil {
+		b.Error(err)
+	}
+
+	buf := bytes.NewBuffer(f)
+	dec := gob.NewDecoder(buf)
+	err = dec.Decode(&sg)
+	if err != nil {
+		b.Error(err)
+	}
+
+	b.ResetTimer()
+	for i := 0; i < b.N; i++ {
+		if _, err := sg.ToJson(&l); err != nil {
+			b.Fatal(err)
+		}
+	}
+}
+
+func BenchmarkToJson(b *testing.B) {
+	benchmarkToJson("benchmark/actors10.txt", b)
+	benchmarkToJson("benchmark/actors100.txt", b)
+	benchmarkToJson("benchmark/actors1000.txt", b)
+	benchmarkToJson("benchmark/directors10.txt", b)
+	benchmarkToJson("benchmark/directors100.txt", b)
+	benchmarkToJson("benchmark/directors1000.txt", b)
+}
+
+func benchmarkToProtocolBuffer(file string, b *testing.B) {
+	b.ReportAllocs()
+	var sg SubGraph
+	var l Latency
+
+	f, err := ioutil.ReadFile(file)
+	if err != nil {
+		b.Error(err)
+	}
+
+	buf := bytes.NewBuffer(f)
+	dec := gob.NewDecoder(buf)
+	err = dec.Decode(&sg)
+	if err != nil {
+		b.Error(err)
+	}
+
+	b.ResetTimer()
+	for i := 0; i < b.N; i++ {
+		if _, err := sg.ToProtocolBuffer(&l); err != nil {
+			b.Fatal(err)
+		}
+	}
+}
+
+func BenchmarkToProtocolBuffer(b *testing.B) {
+	benchmarkToProtocolBuffer("benchmark/actors10.txt", b)
+	benchmarkToProtocolBuffer("benchmark/actors100.txt", b)
+	benchmarkToProtocolBuffer("benchmark/actors1000.txt", b)
+	benchmarkToProtocolBuffer("benchmark/directors10.txt", b)
+	benchmarkToProtocolBuffer("benchmark/directors100.txt", b)
+	benchmarkToProtocolBuffer("benchmark/directors1000.txt", b)
+}
-- 
GitLab