From 007e8f48cc5358e06571386bb531ed76134356bd Mon Sep 17 00:00:00 2001 From: "duanyi.aster" Date: Sun, 28 Apr 2024 15:31:22 +0800 Subject: [PATCH] bench getbypath --- dev/ast/node.go | 9 +++++++++ dev/ast/node_test.go | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/dev/ast/node.go b/dev/ast/node.go index b3abe7e6b..c3b371a1c 100644 --- a/dev/ast/node.go +++ b/dev/ast/node.go @@ -198,7 +198,16 @@ func (self *Node) GetByPath(path ...interface{}) Node { /***************** Cast APIs ***********************/ +func (n *Node) Int64() (int64, error) { + if err := n.should(types.T_NUMBER); err != nil { + return 0, err + } + return n.toInt64() +} +func (n *Node) toInt64() (int64, error) { + return json.Number(n.JSON).Int64() +} /***************** Set APIs ***********************/ \ No newline at end of file diff --git a/dev/ast/node_test.go b/dev/ast/node_test.go index 320735a8a..9dc298ef4 100644 --- a/dev/ast/node_test.go +++ b/dev/ast/node_test.go @@ -27,22 +27,52 @@ func getSample(width int, depth int) string { func TestNodeParse(t *testing.T) { n1, err := NewParser(`[1,"1",true]`).Parse() require.NoError(t, err) - spew.Dump(n1.Kids) + spew.Dump(n1.Kids, len(n1.Kids)) src := getSample(100, 0) n, err := NewParser(src).Parse() require.NoError(t, err) + n50 := n.GetByPath("50") + require.Empty(t, n50.Error()) + v, _ := n50.Int64() + require.Equal(t, int64(1), v) js, err := n.MarshalJSON() require.NoError(t, err) require.Equal(t, src, string(js)) src = getSample(100, 1) n, err = NewParser(src).Parse() - spew.Dump(n.Kids) require.NoError(t, err) js, err = n.MarshalJSON() require.NoError(t, err) require.Equal(t, src, string(js)) } +func BenchmarkNode_GetByPath(b *testing.B) { + b.Run("10/2", func(b *testing.B) { + src := getSample(10, 0) + b.ResetTimer() + n, _ := NewParser(src).Parse() + for i:=0; i< b.N; i++ { + _ = n.GetByPath("5") + } + }) + b.Run("100/2", func(b *testing.B) { + src := getSample(100, 0) + b.ResetTimer() + n, _ := NewParser(src).Parse() + for i:=0; i< b.N; i++ { + _ = n.GetByPath("50") + } + }) + b.Run("1000/2", func(b *testing.B) { + src := getSample(1000, 0) + b.ResetTimer() + n, _ := NewParser(src).Parse() + for i:=0; i< b.N; i++ { + _ = n.GetByPath("500") + } + }) +} + func BenchmarkParse(b *testing.B) { b.Run("10-0", func(b *testing.B) { src := getSample(10, 0)