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