Skip to content

Commit 02e37dd

Browse files
committedMay 15, 2021
添加深拷贝速率测试结果
1 parent 4f80582 commit 02e37dd

9 files changed

+13458
-1
lines changed
 

‎deepcopy_test.go

+64-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
package json_diff
22

33
import (
4+
"bytes"
5+
"encoding/gob"
6+
"fmt"
47
"io/ioutil"
8+
"os"
9+
"runtime/pprof"
510
"testing"
11+
"time"
612
)
713

814
func TestDeepCopy_emptyObject(t *testing.T) {
@@ -22,7 +28,7 @@ func TestDeepCopy_emptyObject(t *testing.T) {
2228
}
2329

2430
func TestDeepCopy(t *testing.T) {
25-
fileName := "./test_data/deepcopy_test.json"
31+
fileName := "./test_data/deepcopy_test/deepcopy_test.json"
2632
input, err := ioutil.ReadFile(fileName)
2733
if err != nil {
2834
t.Error("fail to open the ", fileName)
@@ -69,3 +75,60 @@ func TestDeepCopy(t *testing.T) {
6975
t.Errorf("change source object: %v", cpof.Value)
7076
}
7177
}
78+
79+
func oldDeepCopy(dst, src interface{}) error {
80+
var buf bytes.Buffer
81+
if err := gob.NewEncoder(&buf).Encode(src); err != nil {
82+
return err
83+
}
84+
return gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst)
85+
}
86+
87+
func TestDeepCopy_speed(t *testing.T) {
88+
fileName := "./test_data/deepcopy_test/deepcopy_speed_test.json"
89+
input, err := ioutil.ReadFile(fileName)
90+
if err != nil {
91+
t.Error("fail to open the ", fileName)
92+
}
93+
srcNode, _ := Unmarshal(input)
94+
deepCopySpeedTestHelper(srcNode, t, 1000, true, true)
95+
deepCopySpeedTestHelper(srcNode, t, 1000, true, false)
96+
deepCopySpeedTestHelper(srcNode, t, 1000, false, true)
97+
}
98+
99+
func deepCopySpeedTestHelper(srcNode *JsonNode, t *testing.T, loop int, doOld, doNew bool) {
100+
path := "test_data/deepcopy_test/pprof_result"
101+
name := ""
102+
var err error
103+
if doOld && doNew {
104+
name = fmt.Sprintf("compared_cpu_profile_%d", time.Now().UnixNano())
105+
} else if doOld {
106+
name = fmt.Sprintf("old_func_cpu_profile_%d", time.Now().UnixNano())
107+
} else if doNew {
108+
name = fmt.Sprintf("new_func_cpu_profile_%d", time.Now().UnixNano())
109+
}
110+
f, err := os.Create(fmt.Sprintf("%s/%s", path, name))
111+
if err != nil {
112+
t.Errorf("can not Start CPU Profile: %v", err)
113+
}
114+
_ = pprof.StartCPUProfile(f)
115+
defer pprof.StopCPUProfile()
116+
startTime := time.Now().UnixNano()
117+
for i := 0; i < loop; i++ {
118+
if doOld {
119+
oldCopyRes := new(JsonNode)
120+
err = oldDeepCopy(oldCopyRes, srcNode)
121+
if err != nil {
122+
t.Errorf("fail to copy by old function: %v", err)
123+
}
124+
}
125+
if doNew {
126+
_, err = DeepCopy(srcNode)
127+
if err != nil {
128+
t.Errorf("fail to copy by new function: %v", err)
129+
}
130+
}
131+
}
132+
spend := (time.Now().UnixNano() - startTime) / 1000000
133+
fmt.Printf("do %d loops spend %v ms \n", loop, spend)
134+
}

0 commit comments

Comments
 (0)