benchmark 转移到其他仓库

This commit is contained in:
2019-05-08 17:33:58 +08:00
parent d718d87cd6
commit deaf8cde25
18 changed files with 3082 additions and 3075 deletions

View File

@@ -1,182 +1,201 @@
package heap package heap
import ( import (
"bytes"
"encoding/gob"
"io/ioutil"
"log"
"testing" "testing"
"github.com/Pallinder/go-randomdata" "github.com/474420502/focus/compare"
"github.com/davecgh/go-spew/spew"
"github.com/emirpasic/gods/trees/binaryheap"
) )
func Int(k1, k2 interface{}) int { func TestHeapPushTopPop(t *testing.T) {
c1 := k1.(int) h := New(compare.Int)
c2 := k2.(int) l := []int{9, 5, 15, 2, 3}
switch { ol := []int{15, 9, 5, 3, 2}
case c1 > c2: for _, v := range l {
return -1
case c1 < c2:
return 1
default:
return 0
}
}
func TestPush(t *testing.T) {
for i := 0; i < 1000000; i++ {
h := New(Int)
gods := binaryheap.NewWithIntComparator()
for c := 0; c < 20; c++ {
v := randomdata.Number(0, 100)
h.Push(v) h.Push(v)
gods.Push(v)
} }
r1 := spew.Sprint(h.Values()) for _, tv := range ol {
r2 := spew.Sprint(gods.Values()) if v, isfound := h.Top(); isfound {
if r1 != r2 { if !(isfound && v == tv) {
t.Error(r1) t.Error(v)
t.Error(r2)
break
} }
} }
if v, isfound := h.Pop(); isfound {
if !(isfound && v == tv) {
t.Error(v)
}
}
} }
func TestPop(t *testing.T) { if h.Size() != 0 {
t.Error("heap size is not equals to zero")
}
}
for i := 0; i < 200000; i++ { // func Int(k1, k2 interface{}) int {
h := New(Int) // c1 := k1.(int)
// c2 := k2.(int)
// m := make(map[int]int) // switch {
gods := binaryheap.NewWithIntComparator() // case c1 > c2:
for c := 0; c < 40; c++ { // return -1
v := randomdata.Number(0, 100) // case c1 < c2:
// if _, ok := m[v]; !ok { // return 1
h.Push(v) // default:
gods.Push(v) // return 0
// m[v] = v // }
// } // }
} // func TestPush(t *testing.T) {
// t.Error(h.Values()) // for i := 0; i < 1000000; i++ {
// t.Error(gods.Values()) // h := New(Int)
for c := 0; c < randomdata.Number(5, 10); c++ {
v1, _ := h.Pop()
v2, _ := gods.Pop()
if v1 != v2 { // gods := binaryheap.NewWithIntComparator()
t.Error(h.Values(), v1) // for c := 0; c < 20; c++ {
t.Error(gods.Values(), v2) // v := randomdata.Number(0, 100)
return // h.Push(v)
} // gods.Push(v)
} // }
r1 := spew.Sprint(h.Values()) // r1 := spew.Sprint(h.Values())
r2 := spew.Sprint(gods.Values()) // r2 := spew.Sprint(gods.Values())
if r1 != r2 { // if r1 != r2 {
t.Error(r1) // t.Error(r1)
t.Error(r2) // t.Error(r2)
break // break
} // }
} // }
}
func BenchmarkPush(b *testing.B) { // }
l := loadTestData() // func TestPop(t *testing.T) {
b.ResetTimer() // for i := 0; i < 200000; i++ {
execCount := 50 // h := New(Int)
b.N = len(l) * execCount
for c := 0; c < execCount; c++ { // // m := make(map[int]int)
b.StopTimer() // gods := binaryheap.NewWithIntComparator()
h := New(Int) // for c := 0; c < 40; c++ {
b.StartTimer() // v := randomdata.Number(0, 100)
for _, v := range l { // // if _, ok := m[v]; !ok {
h.Push(v) // h.Push(v)
} // gods.Push(v)
} // // m[v] = v
} // // }
func BenchmarkPop(b *testing.B) { // }
h := New(Int) // // t.Error(h.Values())
// // t.Error(gods.Values())
// for c := 0; c < randomdata.Number(5, 10); c++ {
// v1, _ := h.Pop()
// v2, _ := gods.Pop()
l := loadTestData() // if v1 != v2 {
// t.Error(h.Values(), v1)
// t.Error(gods.Values(), v2)
// return
// }
// }
b.ResetTimer() // r1 := spew.Sprint(h.Values())
execCount := 20 // r2 := spew.Sprint(gods.Values())
b.N = len(l) * execCount // if r1 != r2 {
// t.Error(r1)
// t.Error(r2)
// break
// }
// }
// }
for c := 0; c < execCount; c++ { // func BenchmarkPush(b *testing.B) {
b.StopTimer()
for _, v := range l {
h.Push(v)
}
b.StartTimer()
for h.size != 0 {
h.Pop()
}
}
}
func BenchmarkGodsPop(b *testing.B) { // l := loadTestData()
h := binaryheap.NewWithIntComparator() // b.ResetTimer()
// execCount := 50
// b.N = len(l) * execCount
l := loadTestData() // for c := 0; c < execCount; c++ {
// b.StopTimer()
// h := New(Int)
// b.StartTimer()
// for _, v := range l {
// h.Push(v)
// }
// }
// }
b.ResetTimer() // func BenchmarkPop(b *testing.B) {
execCount := 20
b.N = len(l) * execCount
for c := 0; c < execCount; c++ { // h := New(Int)
b.StopTimer()
for _, v := range l {
h.Push(v)
}
b.StartTimer()
for h.Size() != 0 {
h.Pop()
}
}
} // l := loadTestData()
func BenchmarkGodsPush(b *testing.B) { // b.ResetTimer()
l := loadTestData() // execCount := 20
// b.N = len(l) * execCount
b.ResetTimer() // for c := 0; c < execCount; c++ {
execCount := 50 // b.StopTimer()
b.N = len(l) * execCount // for _, v := range l {
// h.Push(v)
// }
// b.StartTimer()
// for h.size != 0 {
// h.Pop()
// }
// }
// }
for c := 0; c < execCount; c++ { // func BenchmarkGodsPop(b *testing.B) {
b.StopTimer()
h := binaryheap.NewWith(Int)
b.StartTimer()
for _, v := range l {
h.Push(v)
}
}
}
func loadTestData() []int { // h := binaryheap.NewWithIntComparator()
data, err := ioutil.ReadFile("../l.log")
if err != nil { // l := loadTestData()
log.Println(err)
} // b.ResetTimer()
var l []int // execCount := 20
decoder := gob.NewDecoder(bytes.NewReader(data)) // b.N = len(l) * execCount
decoder.Decode(&l)
return l // for c := 0; c < execCount; c++ {
} // b.StopTimer()
// for _, v := range l {
// h.Push(v)
// }
// b.StartTimer()
// for h.Size() != 0 {
// h.Pop()
// }
// }
// }
// func BenchmarkGodsPush(b *testing.B) {
// l := loadTestData()
// b.ResetTimer()
// execCount := 50
// b.N = len(l) * execCount
// for c := 0; c < execCount; c++ {
// b.StopTimer()
// h := binaryheap.NewWith(Int)
// b.StartTimer()
// for _, v := range l {
// h.Push(v)
// }
// }
// }
// func loadTestData() []int {
// data, err := ioutil.ReadFile("../l.log")
// if err != nil {
// log.Println(err)
// }
// var l []int
// decoder := gob.NewDecoder(bytes.NewReader(data))
// decoder.Decode(&l)
// return l
// }

View File

@@ -4,10 +4,6 @@ import (
"testing" "testing"
"github.com/davecgh/go-spew/spew" "github.com/davecgh/go-spew/spew"
"github.com/emirpasic/gods/stacks/arraystack"
"github.com/Pallinder/go-randomdata"
) )
func TestPush(t *testing.T) { func TestPush(t *testing.T) {
@@ -73,101 +69,138 @@ func TestPush(t *testing.T) {
} }
func BenchmarkGet(b *testing.B) { func TestGet(t *testing.T) {
s := New() s := New()
b.N = 20000000
for i := 0; i < b.N; i++ { l := []int{10, 7, 3, 4, 5, 15}
v := randomdata.Number(0, 65535) for _, v := range l {
s.Push(v) s.Push(v)
} }
b.ResetTimer() if v, isfound := s.Get(0); isfound {
b.StartTimer() if v != 15 {
t.Error("15 is not equal to 15")
}
} else {
t.Error("index 0 is not exists")
}
for i := 0; i < b.N; i++ { for i, tv := range l {
s.Get(i) if v, isfound := s.Get(len(l) - 1 - i); isfound {
if v != tv {
t.Error(v, "is not equal to", tv)
}
} else {
t.Error("index 0 is not exists")
} }
} }
func BenchmarkPush(b *testing.B) { for i, tv := range l[0 : len(l)-1] {
s := New() if v, isfound := s.Get(len(l) - 1 - i); isfound {
b.N = 20000000 if v != tv {
for i := 0; i < b.N; i++ { t.Error(v, "is not equal to", tv)
v := randomdata.Number(0, 65535) }
s.Push(v) } else {
t.Error("index 0 is not exists")
}
} }
} }
func BenchmarkGodsPush(b *testing.B) { // func BenchmarkGet(b *testing.B) {
s := arraystack.New() // s := New()
b.N = 2000000 // b.N = 20000000
for i := 0; i < b.N; i++ {
v := randomdata.Number(0, 65535)
s.Push(v)
}
}
func BenchmarkPop(b *testing.B) { // for i := 0; i < b.N; i++ {
s := New() // v := randomdata.Number(0, 65535)
b.N = 2000000 // s.Push(v)
// }
for i := 0; i < b.N; i++ { // b.ResetTimer()
v := randomdata.Number(0, 65535) // b.StartTimer()
s.Push(v)
}
b.ResetTimer() // for i := 0; i < b.N; i++ {
b.StartTimer() // s.Get(i)
// }
// }
for i := 0; i < b.N; i++ { // func BenchmarkPush(b *testing.B) {
s.Pop() // s := New()
} // b.N = 20000000
} // for i := 0; i < b.N; i++ {
// v := randomdata.Number(0, 65535)
// s.Push(v)
// }
// }
func BenchmarkGodsPop(b *testing.B) { // func BenchmarkGodsPush(b *testing.B) {
s := arraystack.New() // s := arraystack.New()
b.N = 2000000 // b.N = 2000000
// for i := 0; i < b.N; i++ {
// v := randomdata.Number(0, 65535)
// s.Push(v)
// }
// }
for i := 0; i < b.N; i++ { // func BenchmarkPop(b *testing.B) {
v := randomdata.Number(0, 65535) // s := New()
s.Push(v) // b.N = 2000000
}
b.ResetTimer() // for i := 0; i < b.N; i++ {
b.StartTimer() // v := randomdata.Number(0, 65535)
// s.Push(v)
// }
for i := 0; i < b.N; i++ { // b.ResetTimer()
s.Pop() // b.StartTimer()
}
}
func BenchmarkValues(b *testing.B) { // for i := 0; i < b.N; i++ {
s := New() // s.Pop()
for i := 0; i < b.N; i++ { // }
v := randomdata.Number(0, 65535) // }
s.Push(v)
}
b.ResetTimer() // func BenchmarkGodsPop(b *testing.B) {
b.StartTimer() // s := arraystack.New()
// b.N = 2000000
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
s.Values() // v := randomdata.Number(0, 65535)
} // s.Push(v)
} // }
func BenchmarkGodsValues(b *testing.B) { // b.ResetTimer()
s := arraystack.New() // b.StartTimer()
for i := 0; i < b.N; i++ {
v := randomdata.Number(0, 65535)
s.Push(v)
}
b.ResetTimer() // for i := 0; i < b.N; i++ {
b.StartTimer() // s.Pop()
// }
// }
for i := 0; i < b.N; i++ { // func BenchmarkValues(b *testing.B) {
s.Values() // s := New()
} // for i := 0; i < b.N; i++ {
} // v := randomdata.Number(0, 65535)
// s.Push(v)
// }
// b.ResetTimer()
// b.StartTimer()
// for i := 0; i < b.N; i++ {
// s.Values()
// }
// }
// func BenchmarkGodsValues(b *testing.B) {
// s := arraystack.New()
// for i := 0; i < b.N; i++ {
// v := randomdata.Number(0, 65535)
// s.Push(v)
// }
// b.ResetTimer()
// b.StartTimer()
// for i := 0; i < b.N; i++ {
// s.Values()
// }
// }

View File

@@ -31,50 +31,50 @@ func TestCount(t *testing.T) {
// t.Error(hm.Get(4)) // t.Error(hm.Get(4))
} }
var executeCount = 5 // var executeCount = 5
var compareSize = 100000 // var compareSize = 100000
func BenchmarkPut(b *testing.B) { // func BenchmarkPut(b *testing.B) {
b.StopTimer() // b.StopTimer()
l := loadTestData() // l := loadTestData()
hm := New() // hm := New()
b.N = len(l) * executeCount // b.N = len(l) * executeCount
// // for i := 0; i < len(l); i++ {
// // v := l[i]
// // hm.Put(v, v)
// // }
// b.StartTimer()
// for c := 0; c < executeCount; c++ {
// for i := 0; i < len(l); i++ { // for i := 0; i < len(l); i++ {
// v := l[i] // v := l[i]
// hm.Put(v, v) // hm.Put(v, v)
// } // }
// }
b.StartTimer() // //b.Log(len(hm.table), hm.size)
// //PrintMemUsage()
// }
for c := 0; c < executeCount; c++ { // func BenchmarkGoPut(b *testing.B) {
for i := 0; i < len(l); i++ {
v := l[i]
hm.Put(v, v)
}
}
//b.Log(len(hm.table), hm.size) // l := loadTestData()
//PrintMemUsage()
}
func BenchmarkGoPut(b *testing.B) { // hm := make(map[int]int)
// b.N = len(l) * executeCount
// for c := 0; c < executeCount; c++ {
// for i := 0; i < len(l); i++ {
// v := l[i]
// hm[v] = v
// }
// }
l := loadTestData() // //b.Log(len(m))
// //PrintMemUsage()
hm := make(map[int]int) // }
b.N = len(l) * executeCount
for c := 0; c < executeCount; c++ {
for i := 0; i < len(l); i++ {
v := l[i]
hm[v] = v
}
}
//b.Log(len(m))
//PrintMemUsage()
}
// func BenchmarkGet(b *testing.B) { // func BenchmarkGet(b *testing.B) {

View File

@@ -222,39 +222,39 @@ func TestRemove(t *testing.T) {
} }
func BenchmarkGet(b *testing.B) { // func BenchmarkGet(b *testing.B) {
pl := New(compare.Int) // pl := New(compare.Int)
l := loadTestData() // l := loadTestData()
for _, v := range l { // for _, v := range l {
pl.Push(v) // pl.Push(v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
if i%2 == 0 { // if i%2 == 0 {
pl.Get(i) // pl.Get(i)
} // }
} // }
} // }
func BenchmarkInsert(b *testing.B) { // func BenchmarkInsert(b *testing.B) {
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 1 // execCount := 1
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
pl := New(compare.Int) // pl := New(compare.Int)
for _, v := range l { // for _, v := range l {
pl.Push(v) // pl.Push(v)
} // }
} // }
} // }

View File

@@ -242,106 +242,106 @@ func TestQueueIndex(t *testing.T) {
} }
} }
func BenchmarkQueueGet(b *testing.B) { // func BenchmarkQueueGet(b *testing.B) {
l := loadTestData() // l := loadTestData()
pq := New(compare.Int) // pq := New(compare.Int)
for _, v := range l { // for _, v := range l {
pq.Push(v) // pq.Push(v)
} // }
execCount := 5 // execCount := 5
b.N = len(l) * execCount // b.N = len(l) * execCount
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
ALL: // ALL:
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
if gv, ok := pq.Get(v); !ok { // if gv, ok := pq.Get(v); !ok {
b.Error(gv) // b.Error(gv)
break ALL // break ALL
} // }
} // }
} // }
} // }
func BenchmarkQueueRemove(b *testing.B) { // func BenchmarkQueueRemove(b *testing.B) {
l := loadTestData() // l := loadTestData()
pq := New(compare.Int) // pq := New(compare.Int)
for _, v := range l { // for _, v := range l {
pq.Push(v) // pq.Push(v)
} // }
b.N = len(l) // b.N = len(l)
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for _, v := range l { // for _, v := range l {
pq.Remove(v) // pq.Remove(v)
} // }
} // }
func BenchmarkQueueIndex(b *testing.B) { // func BenchmarkQueueIndex(b *testing.B) {
l := loadTestData() // l := loadTestData()
pq := New(compare.Int) // pq := New(compare.Int)
for _, v := range l { // for _, v := range l {
pq.Push(v) // pq.Push(v)
} // }
execCount := 2 // execCount := 2
b.N = len(l) * execCount // b.N = len(l) * execCount
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
ALL: // ALL:
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for idx := range l { // for idx := range l {
if v, ok := pq.Index(idx); !ok { // if v, ok := pq.Index(idx); !ok {
b.Error(v) // b.Error(v)
break ALL // break ALL
} // }
} // }
} // }
} // }
func BenchmarkPriorityPush(b *testing.B) { // func BenchmarkPriorityPush(b *testing.B) {
l := loadTestData() // l := loadTestData()
execCount := 5 // execCount := 5
b.N = len(l) * execCount // b.N = len(l) * execCount
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
pq := New(compare.Int) // pq := New(compare.Int)
for _, v := range l { // for _, v := range l {
pq.Push(v) // pq.Push(v)
} // }
} // }
} // }
func BenchmarkPriorityPop(b *testing.B) { // func BenchmarkPriorityPop(b *testing.B) {
l := loadTestData() // l := loadTestData()
pq := New(compare.Int) // pq := New(compare.Int)
for _, v := range l { // for _, v := range l {
pq.Push(v) // pq.Push(v)
} // }
b.N = len(l) // b.N = len(l)
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
pq.Pop() // pq.Pop()
} // }
} // }

View File

@@ -8,12 +8,8 @@ import (
"testing" "testing"
"github.com/474420502/focus/compare" "github.com/474420502/focus/compare"
"github.com/huandu/skiplist"
"github.com/Pallinder/go-randomdata"
"github.com/davecgh/go-spew/spew" "github.com/davecgh/go-spew/spew"
"github.com/emirpasic/gods/trees/avltree"
"github.com/emirpasic/gods/trees/redblacktree"
) )
func loadTestData() []int { func loadTestData() []int {
@@ -178,35 +174,35 @@ func TestPutStable(t *testing.T) {
} }
func TestPutComparatorRandom(t *testing.T) { // func TestPutComparatorRandom(t *testing.T) {
for n := 0; n < 30000; n++ { // for n := 0; n < 30000; n++ {
tree := newVBT(compare.Int) // tree := newVBT(compare.Int)
godsavl := avltree.NewWithIntComparator() // godsavl := avltree.NewWithIntComparator()
content := "" // content := ""
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(m) < 50; i++ { // for i := 0; len(m) < 50; i++ {
v := randomdata.Number(0, 65535) // v := randomdata.Number(0, 65535)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
m[v] = v // m[v] = v
content += spew.Sprint(v) + "," // content += spew.Sprint(v) + ","
tree.Put(v) // tree.Put(v)
godsavl.Put(v, v) // godsavl.Put(v, v)
} // }
} // }
s1 := spew.Sprint(tree.Values()) // s1 := spew.Sprint(tree.Values())
s2 := spew.Sprint(godsavl.Values()) // s2 := spew.Sprint(godsavl.Values())
if s1 != s2 { // if s1 != s2 {
t.Error(godsavl.String()) // t.Error(godsavl.String())
t.Error(tree.debugString()) // t.Error(tree.debugString())
t.Error(content, n) // t.Error(content, n)
break // break
} // }
} // }
} // }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
tree := newVBT(compare.Int) tree := newVBT(compare.Int)
@@ -306,351 +302,351 @@ func TestTravalsal(t *testing.T) {
} }
func TestRemoveAll(t *testing.T) { // func TestRemoveAll(t *testing.T) {
ALL: // ALL:
for c := 0; c < 20000; c++ { // for c := 0; c < 20000; c++ {
tree := newVBT(compare.Int) // tree := newVBT(compare.Int)
gods := avltree.NewWithIntComparator() // gods := avltree.NewWithIntComparator()
var l []int // var l []int
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(l) < 50; i++ { // for i := 0; len(l) < 50; i++ {
v := randomdata.Number(0, 65535) // v := randomdata.Number(0, 65535)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
m[v] = v // m[v] = v
l = append(l, v) // l = append(l, v)
tree.Put(v) // tree.Put(v)
gods.Put(v, v) // gods.Put(v, v)
} // }
} // }
for i := 0; i < 50; i++ { // for i := 0; i < 50; i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
gods.Remove(l[i]) // gods.Remove(l[i])
s1 := spew.Sprint(tree.Values()) // s1 := spew.Sprint(tree.Values())
s2 := spew.Sprint(gods.Values()) // s2 := spew.Sprint(gods.Values())
if s1 != s2 { // if s1 != s2 {
t.Error("avl remove error", "avlsize = ", tree.Size()) // t.Error("avl remove error", "avlsize = ", tree.Size())
t.Error(tree.root, i, l[i]) // t.Error(tree.root, i, l[i])
t.Error(s1) // t.Error(s1)
t.Error(s2) // t.Error(s2)
break ALL // break ALL
} // }
} // }
} // }
} // }
func TestRemove(t *testing.T) { // func TestRemove(t *testing.T) {
ALL: // ALL:
for N := 0; N < 5000; N++ { // for N := 0; N < 5000; N++ {
tree := newVBT(compare.Int) // tree := newVBT(compare.Int)
gods := avltree.NewWithIntComparator() // gods := avltree.NewWithIntComparator()
var l []int // var l []int
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(l) < 20; i++ { // for i := 0; len(l) < 20; i++ {
v := randomdata.Number(0, 100) // v := randomdata.Number(0, 100)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
l = append(l, v) // l = append(l, v)
m[v] = v // m[v] = v
tree.Put(v) // tree.Put(v)
gods.Put(v, v) // gods.Put(v, v)
} // }
} // }
src1 := tree.String() // src1 := tree.String()
src2 := gods.String() // src2 := gods.String()
for i := 0; i < 20; i++ { // for i := 0; i < 20; i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
gods.Remove(l[i]) // gods.Remove(l[i])
if tree.root != nil && spew.Sprint(gods.Values()) != spew.Sprint(tree.Values()) { // if tree.root != nil && spew.Sprint(gods.Values()) != spew.Sprint(tree.Values()) {
t.Error(src1) // t.Error(src1)
t.Error(src2) // t.Error(src2)
t.Error(tree.debugString()) // t.Error(tree.debugString())
t.Error(gods.String()) // t.Error(gods.String())
t.Error(l[i]) // t.Error(l[i])
break ALL // break ALL
} // }
} // }
} // }
} // }
func BenchmarkSkipListGet(b *testing.B) { // func BenchmarkSkipListGet(b *testing.B) {
sl := skiplist.New(skiplist.Int) // sl := skiplist.New(skiplist.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
sl.Set(v, v) // sl.Set(v, v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 5 // execCount := 5
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
e := sl.Get(v) // e := sl.Get(v)
var result [50]interface{} // var result [50]interface{}
for i := 0; i < 50 && e != nil; i++ { // for i := 0; i < 50 && e != nil; i++ {
result[i] = e.Value // result[i] = e.Value
e = e.Next() // e = e.Next()
} // }
} // }
} // }
} // }
func BenchmarkGetRange(b *testing.B) { // func BenchmarkGetRange(b *testing.B) {
} // }
func BenchmarkIndexRange(b *testing.B) { // func BenchmarkIndexRange(b *testing.B) {
tree := newVBT(compare.Int) // tree := newVBT(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v) // tree.Put(v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 5 // execCount := 5
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for range l { // for range l {
tree.IndexRange(i, i+49) // tree.IndexRange(i, i+49)
} // }
} // }
} // }
func BenchmarkSkipListSet(b *testing.B) { // func BenchmarkSkipListSet(b *testing.B) {
l := loadTestData() // l := loadTestData()
execCount := 1 // execCount := 1
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
sl := skiplist.New(skiplist.Int) // sl := skiplist.New(skiplist.Int)
for _, v := range l { // for _, v := range l {
sl.Set(v, v) // sl.Set(v, v)
} // }
} // }
} // }
func BenchmarkIterator(b *testing.B) { // func BenchmarkIterator(b *testing.B) {
tree := newVBT(compare.Int) // tree := newVBT(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v) // tree.Put(v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
iter := tree.Iterator() // iter := tree.Iterator()
b.N = 0 // b.N = 0
for iter.Next() { // for iter.Next() {
b.N++ // b.N++
} // }
for iter.Prev() { // for iter.Prev() {
b.N++ // b.N++
} // }
for iter.Next() { // for iter.Next() {
b.N++ // b.N++
} // }
b.Log(b.N, len(l)) // b.Log(b.N, len(l))
} // }
func BenchmarkRemove(b *testing.B) { // func BenchmarkRemove(b *testing.B) {
tree := newVBT(compare.Int) // tree := newVBT(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v) // tree.Put(v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(l); i++ { // for i := 0; i < len(l); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGodsRemove(b *testing.B) { // func BenchmarkGodsRemove(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(l); i++ { // for i := 0; i < len(l); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGodsRBRemove(b *testing.B) { // func BenchmarkGodsRBRemove(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(l); i++ { // for i := 0; i < len(l); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGet(b *testing.B) { // func BenchmarkGet(b *testing.B) {
tree := newVBT(compare.Int) // tree := newVBT(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Put(l[i]) // tree.Put(l[i])
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 5 // execCount := 5
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
tree.Get(v) // tree.Get(v)
} // }
} // }
} // }
func BenchmarkGodsRBGet(b *testing.B) { // func BenchmarkGodsRBGet(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Put(l[i], i) // tree.Put(l[i], i)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 10 // execCount := 10
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
tree.Get(v) // tree.Get(v)
} // }
} // }
} // }
func BenchmarkGodsAvlGet(b *testing.B) { // func BenchmarkGodsAvlGet(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Put(l[i], i) // tree.Put(l[i], i)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 10 // execCount := 10
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
tree.Get(v) // tree.Get(v)
} // }
} // }
} // }
func BenchmarkPut(b *testing.B) { // func BenchmarkPut(b *testing.B) {
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 50 // execCount := 50
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
tree := newVBT(compare.Int) // tree := newVBT(compare.Int)
for _, v := range l { // for _, v := range l {
tree.Put(v) // tree.Put(v)
} // }
} // }
} // }
func BenchmarkIndex(b *testing.B) { // func BenchmarkIndex(b *testing.B) {
tree := newVBT(compare.Int) // tree := newVBT(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Put(l[i]) // tree.Put(l[i])
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Index(i) // tree.Index(i)
} // }
} // }
func BenchmarkGodsRBPut(b *testing.B) { // func BenchmarkGodsRBPut(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
} // }
func BenchmarkGodsPut(b *testing.B) { // func BenchmarkGodsPut(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
} // }

View File

@@ -242,106 +242,106 @@ func TestQueueIndex(t *testing.T) {
} }
} }
func BenchmarkQueueGet(b *testing.B) { // func BenchmarkQueueGet(b *testing.B) {
l := loadTestData() // l := loadTestData()
pq := New(compare.Int) // pq := New(compare.Int)
for _, v := range l { // for _, v := range l {
pq.Push(v, v) // pq.Push(v, v)
} // }
execCount := 5 // execCount := 5
b.N = len(l) * execCount // b.N = len(l) * execCount
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
ALL: // ALL:
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
if gv, ok := pq.Get(v); !ok { // if gv, ok := pq.Get(v); !ok {
b.Error(gv) // b.Error(gv)
break ALL // break ALL
} // }
} // }
} // }
} // }
func BenchmarkQueueRemove(b *testing.B) { // func BenchmarkQueueRemove(b *testing.B) {
l := loadTestData() // l := loadTestData()
pq := New(compare.Int) // pq := New(compare.Int)
for _, v := range l { // for _, v := range l {
pq.Push(v, v) // pq.Push(v, v)
} // }
b.N = len(l) // b.N = len(l)
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for _, v := range l { // for _, v := range l {
pq.Remove(v) // pq.Remove(v)
} // }
} // }
func BenchmarkQueueIndex(b *testing.B) { // func BenchmarkQueueIndex(b *testing.B) {
l := loadTestData() // l := loadTestData()
pq := New(compare.Int) // pq := New(compare.Int)
for _, v := range l { // for _, v := range l {
pq.Push(v, v) // pq.Push(v, v)
} // }
execCount := 2 // execCount := 2
b.N = len(l) * execCount // b.N = len(l) * execCount
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
ALL: // ALL:
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for idx := range l { // for idx := range l {
if v, ok := pq.Index(idx); !ok { // if v, ok := pq.Index(idx); !ok {
b.Error(v) // b.Error(v)
break ALL // break ALL
} // }
} // }
} // }
} // }
func BenchmarkPriorityPush(b *testing.B) { // func BenchmarkPriorityPush(b *testing.B) {
l := loadTestData() // l := loadTestData()
execCount := 5 // execCount := 5
b.N = len(l) * execCount // b.N = len(l) * execCount
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
pq := New(compare.Int) // pq := New(compare.Int)
for _, v := range l { // for _, v := range l {
pq.Push(v, v) // pq.Push(v, v)
} // }
} // }
} // }
func BenchmarkPriorityPop(b *testing.B) { // func BenchmarkPriorityPop(b *testing.B) {
l := loadTestData() // l := loadTestData()
pq := New(compare.Int) // pq := New(compare.Int)
for _, v := range l { // for _, v := range l {
pq.Push(v, v) // pq.Push(v, v)
} // }
b.N = len(l) // b.N = len(l)
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
pq.Pop() // pq.Pop()
} // }
} // }

View File

@@ -8,12 +8,8 @@ import (
"testing" "testing"
"github.com/474420502/focus/compare" "github.com/474420502/focus/compare"
"github.com/huandu/skiplist"
"github.com/Pallinder/go-randomdata"
"github.com/davecgh/go-spew/spew" "github.com/davecgh/go-spew/spew"
"github.com/emirpasic/gods/trees/avltree"
"github.com/emirpasic/gods/trees/redblacktree"
) )
func loadTestData() []int { func loadTestData() []int {
@@ -178,35 +174,35 @@ func TestPutStable(t *testing.T) {
} }
func TestPutComparatorRandom(t *testing.T) { // func TestPutComparatorRandom(t *testing.T) {
for n := 0; n < 30000; n++ { // for n := 0; n < 30000; n++ {
tree := newVBT(compare.Int) // tree := newVBT(compare.Int)
godsavl := avltree.NewWithIntComparator() // godsavl := avltree.NewWithIntComparator()
content := "" // content := ""
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(m) < 50; i++ { // for i := 0; len(m) < 50; i++ {
v := randomdata.Number(0, 65535) // v := randomdata.Number(0, 65535)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
m[v] = v // m[v] = v
content += spew.Sprint(v) + "," // content += spew.Sprint(v) + ","
tree.Put(v, v) // tree.Put(v, v)
godsavl.Put(v, v) // godsavl.Put(v, v)
} // }
} // }
s1 := spew.Sprint(tree.Values()) // s1 := spew.Sprint(tree.Values())
s2 := spew.Sprint(godsavl.Values()) // s2 := spew.Sprint(godsavl.Values())
if s1 != s2 { // if s1 != s2 {
t.Error(godsavl.String()) // t.Error(godsavl.String())
t.Error(tree.debugString()) // t.Error(tree.debugString())
t.Error(content, n) // t.Error(content, n)
break // break
} // }
} // }
} // }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
tree := newVBT(compare.Int) tree := newVBT(compare.Int)
@@ -306,351 +302,351 @@ func TestTravalsal(t *testing.T) {
} }
func TestRemoveAll(t *testing.T) { // func TestRemoveAll(t *testing.T) {
ALL: // ALL:
for c := 0; c < 20000; c++ { // for c := 0; c < 20000; c++ {
tree := newVBT(compare.Int) // tree := newVBT(compare.Int)
gods := avltree.NewWithIntComparator() // gods := avltree.NewWithIntComparator()
var l []int // var l []int
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(l) < 50; i++ { // for i := 0; len(l) < 50; i++ {
v := randomdata.Number(0, 65535) // v := randomdata.Number(0, 65535)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
m[v] = v // m[v] = v
l = append(l, v) // l = append(l, v)
tree.Put(v, v) // tree.Put(v, v)
gods.Put(v, v) // gods.Put(v, v)
} // }
} // }
for i := 0; i < 50; i++ { // for i := 0; i < 50; i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
gods.Remove(l[i]) // gods.Remove(l[i])
s1 := spew.Sprint(tree.Values()) // s1 := spew.Sprint(tree.Values())
s2 := spew.Sprint(gods.Values()) // s2 := spew.Sprint(gods.Values())
if s1 != s2 { // if s1 != s2 {
t.Error("avl remove error", "avlsize = ", tree.Size()) // t.Error("avl remove error", "avlsize = ", tree.Size())
t.Error(tree.root, i, l[i]) // t.Error(tree.root, i, l[i])
t.Error(s1) // t.Error(s1)
t.Error(s2) // t.Error(s2)
break ALL // break ALL
} // }
} // }
} // }
} // }
func TestRemove(t *testing.T) { // func TestRemove(t *testing.T) {
ALL: // ALL:
for N := 0; N < 5000; N++ { // for N := 0; N < 5000; N++ {
tree := newVBT(compare.Int) // tree := newVBT(compare.Int)
gods := avltree.NewWithIntComparator() // gods := avltree.NewWithIntComparator()
var l []int // var l []int
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(l) < 20; i++ { // for i := 0; len(l) < 20; i++ {
v := randomdata.Number(0, 100) // v := randomdata.Number(0, 100)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
l = append(l, v) // l = append(l, v)
m[v] = v // m[v] = v
tree.Put(v, v) // tree.Put(v, v)
gods.Put(v, v) // gods.Put(v, v)
} // }
} // }
src1 := tree.String() // src1 := tree.String()
src2 := gods.String() // src2 := gods.String()
for i := 0; i < 20; i++ { // for i := 0; i < 20; i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
gods.Remove(l[i]) // gods.Remove(l[i])
if tree.root != nil && spew.Sprint(gods.Values()) != spew.Sprint(tree.Values()) { // if tree.root != nil && spew.Sprint(gods.Values()) != spew.Sprint(tree.Values()) {
t.Error(src1) // t.Error(src1)
t.Error(src2) // t.Error(src2)
t.Error(tree.debugString()) // t.Error(tree.debugString())
t.Error(gods.String()) // t.Error(gods.String())
t.Error(l[i]) // t.Error(l[i])
break ALL // break ALL
} // }
} // }
} // }
} // }
func BenchmarkSkipListGet(b *testing.B) { // func BenchmarkSkipListGet(b *testing.B) {
sl := skiplist.New(skiplist.Int) // sl := skiplist.New(skiplist.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
sl.Set(v, v) // sl.Set(v, v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 5 // execCount := 5
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
e := sl.Get(v) // e := sl.Get(v)
var result [50]interface{} // var result [50]interface{}
for i := 0; i < 50 && e != nil; i++ { // for i := 0; i < 50 && e != nil; i++ {
result[i] = e.Value // result[i] = e.Value
e = e.Next() // e = e.Next()
} // }
} // }
} // }
} // }
func BenchmarkGetRange(b *testing.B) { // func BenchmarkGetRange(b *testing.B) {
} // }
func BenchmarkIndexRange(b *testing.B) { // func BenchmarkIndexRange(b *testing.B) {
tree := newVBT(compare.Int) // tree := newVBT(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 5 // execCount := 5
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for range l { // for range l {
tree.IndexRange(i, i+49) // tree.IndexRange(i, i+49)
} // }
} // }
} // }
func BenchmarkSkipListSet(b *testing.B) { // func BenchmarkSkipListSet(b *testing.B) {
l := loadTestData() // l := loadTestData()
execCount := 1 // execCount := 1
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
sl := skiplist.New(skiplist.Int) // sl := skiplist.New(skiplist.Int)
for _, v := range l { // for _, v := range l {
sl.Set(v, v) // sl.Set(v, v)
} // }
} // }
} // }
func BenchmarkIterator(b *testing.B) { // func BenchmarkIterator(b *testing.B) {
tree := newVBT(compare.Int) // tree := newVBT(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
iter := tree.Iterator() // iter := tree.Iterator()
b.N = 0 // b.N = 0
for iter.Next() { // for iter.Next() {
b.N++ // b.N++
} // }
for iter.Prev() { // for iter.Prev() {
b.N++ // b.N++
} // }
for iter.Next() { // for iter.Next() {
b.N++ // b.N++
} // }
b.Log(b.N, len(l)) // b.Log(b.N, len(l))
} // }
func BenchmarkRemove(b *testing.B) { // func BenchmarkRemove(b *testing.B) {
tree := newVBT(compare.Int) // tree := newVBT(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(l); i++ { // for i := 0; i < len(l); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGodsRemove(b *testing.B) { // func BenchmarkGodsRemove(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(l); i++ { // for i := 0; i < len(l); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGodsRBRemove(b *testing.B) { // func BenchmarkGodsRBRemove(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(l); i++ { // for i := 0; i < len(l); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGet(b *testing.B) { // func BenchmarkGet(b *testing.B) {
tree := newVBT(compare.Int) // tree := newVBT(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Put(l[i], l[i]) // tree.Put(l[i], l[i])
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 5 // execCount := 5
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
tree.Get(v) // tree.Get(v)
} // }
} // }
} // }
func BenchmarkGodsRBGet(b *testing.B) { // func BenchmarkGodsRBGet(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Put(l[i], i) // tree.Put(l[i], i)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 10 // execCount := 10
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
tree.Get(v) // tree.Get(v)
} // }
} // }
} // }
func BenchmarkGodsAvlGet(b *testing.B) { // func BenchmarkGodsAvlGet(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Put(l[i], i) // tree.Put(l[i], i)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 10 // execCount := 10
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
tree.Get(v) // tree.Get(v)
} // }
} // }
} // }
func BenchmarkPut(b *testing.B) { // func BenchmarkPut(b *testing.B) {
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 50 // execCount := 50
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
tree := newVBT(compare.Int) // tree := newVBT(compare.Int)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
} // }
} // }
func BenchmarkIndex(b *testing.B) { // func BenchmarkIndex(b *testing.B) {
tree := newVBT(compare.Int) // tree := newVBT(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Put(l[i], l[i]) // tree.Put(l[i], l[i])
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Index(i) // tree.Index(i)
} // }
} // }
func BenchmarkGodsRBPut(b *testing.B) { // func BenchmarkGodsRBPut(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
} // }
func BenchmarkGodsPut(b *testing.B) { // func BenchmarkGodsPut(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
} // }

View File

@@ -4,8 +4,6 @@ import (
"testing" "testing"
"github.com/davecgh/go-spew/spew" "github.com/davecgh/go-spew/spew"
"github.com/Pallinder/go-randomdata"
) )
func testSet1(t *testing.T) { func testSet1(t *testing.T) {
@@ -191,58 +189,58 @@ func TestArray2Grow(t *testing.T) {
} }
} }
func BenchmarkArray2Set(b *testing.B) { // func BenchmarkArray2Set(b *testing.B) {
arr := NewWithCap(1000, 100) // arr := NewWithCap(1000, 100)
b.N = 500000000 // b.N = 500000000
b.StopTimer() // b.StopTimer()
var l []int // var l []int
for i := 0; i < b.N/10; i++ { // for i := 0; i < b.N/10; i++ {
l = append(l, randomdata.Number(0, 65535)) // l = append(l, randomdata.Number(0, 65535))
} // }
b.StartTimer() // b.StartTimer()
for c := 0; c < 10; c++ { // for c := 0; c < 10; c++ {
for i := 0; i < b.N/10; i++ { // for i := 0; i < b.N/10; i++ {
arr.Set(l[i], i) // arr.Set(l[i], i)
} // }
} // }
} // }
func BenchmarkArray2Get(b *testing.B) { // func BenchmarkArray2Get(b *testing.B) {
arr := NewWithCap(1000, 100) // arr := NewWithCap(1000, 100)
b.N = 500000000 // b.N = 500000000
b.StopTimer() // b.StopTimer()
for i := 0; i < 105535; i++ { // for i := 0; i < 105535; i++ {
v := randomdata.Number(0, 65535) // v := randomdata.Number(0, 65535)
arr.Set(v, v) // arr.Set(v, v)
} // }
b.StartTimer() // b.StartTimer()
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
arr.Get(i % 65535) // arr.Get(i % 65535)
} // }
} // }
func BenchmarkArray2Del(b *testing.B) { // func BenchmarkArray2Del(b *testing.B) {
arr := NewWithCap(1000, 100) // arr := NewWithCap(1000, 100)
b.N = 500000000 // b.N = 500000000
b.StopTimer() // b.StopTimer()
for i := 0; i < 105535; i++ { // for i := 0; i < 105535; i++ {
v := randomdata.Number(0, 65535) // v := randomdata.Number(0, 65535)
arr.Set(v, v) // arr.Set(v, v)
} // }
b.StartTimer() // b.StartTimer()
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
arr.Del(i % 65535) // arr.Del(i % 65535)
} // }
} // }

View File

@@ -4,8 +4,6 @@ import (
"testing" "testing"
"github.com/davecgh/go-spew/spew" "github.com/davecgh/go-spew/spew"
"github.com/Pallinder/go-randomdata"
) )
func testSet1(t *testing.T) { func testSet1(t *testing.T) {
@@ -161,55 +159,55 @@ func TestArray2Del(t *testing.T) {
arr.Del(18) arr.Del(18)
} }
func BenchmarkArray3Set(b *testing.B) { // func BenchmarkArray3Set(b *testing.B) {
arr := NewWithCap(100, 100, 10) // arr := NewWithCap(100, 100, 10)
b.N = 500000000 // b.N = 500000000
b.StopTimer() // b.StopTimer()
var l []int // var l []int
for i := 0; i < b.N/10; i++ { // for i := 0; i < b.N/10; i++ {
l = append(l, randomdata.Number(0, 65535)) // l = append(l, randomdata.Number(0, 65535))
} // }
b.StartTimer() // b.StartTimer()
for c := 0; c < 10; c++ { // for c := 0; c < 10; c++ {
for i := 0; i < b.N/10; i++ { // for i := 0; i < b.N/10; i++ {
arr.Set(l[i], i) // arr.Set(l[i], i)
} // }
} // }
} // }
func BenchmarkArray3Get(b *testing.B) { // func BenchmarkArray3Get(b *testing.B) {
arr := NewWithCap(100, 100, 10) // arr := NewWithCap(100, 100, 10)
b.N = 500000000 // b.N = 500000000
b.StopTimer() // b.StopTimer()
for i := 0; i < 105535; i++ { // for i := 0; i < 105535; i++ {
v := randomdata.Number(0, 65535) // v := randomdata.Number(0, 65535)
arr.Set(v, v) // arr.Set(v, v)
} // }
b.StartTimer() // b.StartTimer()
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
arr.Get(i % 65535) // arr.Get(i % 65535)
} // }
} // }
func BenchmarkArray3Del(b *testing.B) { // func BenchmarkArray3Del(b *testing.B) {
arr := NewWithCap(100, 100, 10) // arr := NewWithCap(100, 100, 10)
b.N = 500000000 // b.N = 500000000
b.StopTimer() // b.StopTimer()
for i := 0; i < 105535; i++ { // for i := 0; i < 105535; i++ {
v := randomdata.Number(0, 65535) // v := randomdata.Number(0, 65535)
arr.Set(v, v) // arr.Set(v, v)
} // }
b.StartTimer() // b.StartTimer()
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
arr.Del(i % 65535) // arr.Del(i % 65535)
} // }
} // }

View File

@@ -3,7 +3,6 @@ package arrayn
import ( import (
"testing" "testing"
"github.com/Pallinder/go-randomdata"
"github.com/davecgh/go-spew/spew" "github.com/davecgh/go-spew/spew"
) )
@@ -171,54 +170,54 @@ func TestArray2Grow(t *testing.T) {
} }
} }
func BenchmarkGoMap(b *testing.B) { // func BenchmarkGoMap(b *testing.B) {
m := make(map[int]bool) // m := make(map[int]bool)
b.N = 50000000 // b.N = 50000000
b.StopTimer() // b.StopTimer()
var l []int // var l []int
for i := 0; i < b.N/10; i++ { // for i := 0; i < b.N/10; i++ {
l = append(l, randomdata.Number(0, 100000000)) // l = append(l, randomdata.Number(0, 100000000))
} // }
b.StartTimer() // b.StartTimer()
for c := 0; c < 10; c++ { // for c := 0; c < 10; c++ {
for i := 0; i < b.N/10; i++ { // for i := 0; i < b.N/10; i++ {
m[l[i]] = true // m[l[i]] = true
} // }
} // }
} // }
func BenchmarkArrayNSet(b *testing.B) { // func BenchmarkArrayNSet(b *testing.B) {
arr := NewWithCap(1000, 10, 10, 100) // arr := NewWithCap(1000, 10, 10, 100)
b.N = 10000000 // b.N = 10000000
b.StopTimer() // b.StopTimer()
var l []int // var l []int
for i := 0; i < b.N/10; i++ { // for i := 0; i < b.N/10; i++ {
l = append(l, randomdata.Number(0, 10000000)) // l = append(l, randomdata.Number(0, 10000000))
} // }
b.StartTimer() // b.StartTimer()
for c := 0; c < 10; c++ { // for c := 0; c < 10; c++ {
for i := 0; i < b.N/10; i++ { // for i := 0; i < b.N/10; i++ {
arr.Set(l[i], i) // arr.Set(l[i], i)
} // }
} // }
} // }
func BenchmarkArray3Set(b *testing.B) { // func BenchmarkArray3Set(b *testing.B) {
arr := NewWithCap(100, 100, 10) // arr := NewWithCap(100, 100, 10)
b.N = 500000000 // b.N = 500000000
b.StopTimer() // b.StopTimer()
var l []int // var l []int
for i := 0; i < b.N/10; i++ { // for i := 0; i < b.N/10; i++ {
l = append(l, randomdata.Number(0, 65535)) // l = append(l, randomdata.Number(0, 65535))
} // }
b.StartTimer() // b.StartTimer()
for c := 0; c < 10; c++ { // for c := 0; c < 10; c++ {
for i := 0; i < b.N/10; i++ { // for i := 0; i < b.N/10; i++ {
arr.Set(l[i], i) // arr.Set(l[i], i)
} // }
} // }
} // }

View File

@@ -1,91 +1,83 @@
package lastack package lastack
import ( // func BenchmarkPush(b *testing.B) {
"testing" // s := New()
// b.N = 200000
// for i := 0; i < b.N; i++ {
// v := randomdata.Number(0, 65535)
// s.Push(v)
// }
// }
"github.com/emirpasic/gods/stacks/arraystack" // func BenchmarkGodsPush(b *testing.B) {
// s := arraystack.New()
// b.N = 200000
// for i := 0; i < b.N; i++ {
// v := randomdata.Number(0, 65535)
// s.Push(v)
// }
// }
"github.com/Pallinder/go-randomdata" // func BenchmarkPop(b *testing.B) {
) // s := New()
// b.N = 200000
func BenchmarkPush(b *testing.B) { // for i := 0; i < b.N; i++ {
s := New() // v := randomdata.Number(0, 65535)
b.N = 200000 // s.Push(v)
for i := 0; i < b.N; i++ { // }
v := randomdata.Number(0, 65535)
s.Push(v)
}
}
func BenchmarkGodsPush(b *testing.B) { // b.ResetTimer()
s := arraystack.New() // b.StartTimer()
b.N = 200000
for i := 0; i < b.N; i++ {
v := randomdata.Number(0, 65535)
s.Push(v)
}
}
func BenchmarkPop(b *testing.B) { // for i := 0; i < b.N; i++ {
s := New() // s.Pop()
b.N = 200000 // }
// }
for i := 0; i < b.N; i++ { // func BenchmarkGodsPop(b *testing.B) {
v := randomdata.Number(0, 65535) // s := arraystack.New()
s.Push(v) // b.N = 200000
}
b.ResetTimer() // for i := 0; i < b.N; i++ {
b.StartTimer() // v := randomdata.Number(0, 65535)
// s.Push(v)
// }
for i := 0; i < b.N; i++ { // b.ResetTimer()
s.Pop() // b.StartTimer()
}
}
func BenchmarkGodsPop(b *testing.B) { // for i := 0; i < b.N; i++ {
s := arraystack.New() // s.Pop()
b.N = 200000 // }
// }
for i := 0; i < b.N; i++ { // func BenchmarkValues(b *testing.B) {
v := randomdata.Number(0, 65535) // s := New()
s.Push(v) // for i := 0; i < b.N; i++ {
} // v := randomdata.Number(0, 65535)
// s.Push(v)
// }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
s.Pop() // s.Values()
} // }
} // }
func BenchmarkValues(b *testing.B) { // func BenchmarkGodsValues(b *testing.B) {
s := New() // s := arraystack.New()
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
v := randomdata.Number(0, 65535) // v := randomdata.Number(0, 65535)
s.Push(v) // s.Push(v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
s.Values() // s.Values()
} // }
} // }
func BenchmarkGodsValues(b *testing.B) {
s := arraystack.New()
for i := 0; i < b.N; i++ {
v := randomdata.Number(0, 65535)
s.Push(v)
}
b.ResetTimer()
b.StartTimer()
for i := 0; i < b.N; i++ {
s.Values()
}
}

View File

@@ -8,10 +8,7 @@ import (
"testing" "testing"
"github.com/474420502/focus/compare" "github.com/474420502/focus/compare"
"github.com/Pallinder/go-randomdata"
"github.com/davecgh/go-spew/spew" "github.com/davecgh/go-spew/spew"
"github.com/emirpasic/gods/trees/avltree"
"github.com/emirpasic/gods/trees/redblacktree"
) )
func loadTestData() []int { func loadTestData() []int {
@@ -225,32 +222,32 @@ func TestPutStable(t *testing.T) {
// t.Error(tree.debugString(), tree.TraversalBreadth(), "\n", "-----------") // t.Error(tree.debugString(), tree.TraversalBreadth(), "\n", "-----------")
} }
func TestPutComparatorRandom(t *testing.T) { // func TestPutComparatorRandom(t *testing.T) {
for n := 0; n < 300000; n++ { // for n := 0; n < 300000; n++ {
tree := New(compare.Int) // tree := New(compare.Int)
godsavl := avltree.NewWithIntComparator() // godsavl := avltree.NewWithIntComparator()
content := "" // content := ""
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(m) < 10; i++ { // for i := 0; len(m) < 10; i++ {
v := randomdata.Number(0, 65535) // v := randomdata.Number(0, 65535)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
m[v] = v // m[v] = v
content += spew.Sprint(v) + "," // content += spew.Sprint(v) + ","
tree.Put(v) // tree.Put(v)
godsavl.Put(v, v) // godsavl.Put(v, v)
} // }
} // }
if tree.String() != godsavl.String() { // if tree.String() != godsavl.String() {
t.Error(godsavl.String()) // t.Error(godsavl.String())
t.Error(tree.debugString()) // t.Error(tree.debugString())
t.Error(content, n) // t.Error(content, n)
break // break
} // }
} // }
} // }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
tree := New(compare.Int) tree := New(compare.Int)
@@ -290,273 +287,273 @@ func TestGet(t *testing.T) {
} }
func TestRemoveAll(t *testing.T) { // func TestRemoveAll(t *testing.T) {
ALL: // ALL:
for c := 0; c < 50000; c++ { // for c := 0; c < 50000; c++ {
tree := New(compare.Int) // tree := New(compare.Int)
gods := avltree.NewWithIntComparator() // gods := avltree.NewWithIntComparator()
var l []int // var l []int
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(l) < 50; i++ { // for i := 0; len(l) < 50; i++ {
v := randomdata.Number(0, 100000) // v := randomdata.Number(0, 100000)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
m[v] = v // m[v] = v
l = append(l, v) // l = append(l, v)
tree.Put(v) // tree.Put(v)
gods.Put(v, v) // gods.Put(v, v)
} // }
} // }
for i := 0; i < 50; i++ { // for i := 0; i < 50; i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
gods.Remove(l[i]) // gods.Remove(l[i])
s1 := spew.Sprint(tree.Values()) // s1 := spew.Sprint(tree.Values())
s2 := spew.Sprint(gods.Values()) // s2 := spew.Sprint(gods.Values())
if s1 != s2 { // if s1 != s2 {
t.Error("avl remove error", "avlsize = ", tree.Size()) // t.Error("avl remove error", "avlsize = ", tree.Size())
t.Error(s1) // t.Error(s1)
t.Error(s2) // t.Error(s2)
break ALL // break ALL
} // }
} // }
} // }
} // }
func TestRemove(t *testing.T) { // func TestRemove(t *testing.T) {
ALL: // ALL:
for N := 0; N < 500000; N++ { // for N := 0; N < 500000; N++ {
tree := New(compare.Int) // tree := New(compare.Int)
gods := avltree.NewWithIntComparator() // gods := avltree.NewWithIntComparator()
var l []int // var l []int
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(l) < 10; i++ { // for i := 0; len(l) < 10; i++ {
v := randomdata.Number(0, 100) // v := randomdata.Number(0, 100)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
l = append(l, v) // l = append(l, v)
m[v] = v // m[v] = v
tree.Put(v) // tree.Put(v)
gods.Put(v, v) // gods.Put(v, v)
} // }
} // }
src1 := tree.String() // src1 := tree.String()
src2 := gods.String() // src2 := gods.String()
for i := 0; i < 10; i++ { // for i := 0; i < 10; i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
gods.Remove(l[i]) // gods.Remove(l[i])
if spew.Sprint(gods.Values()) != spew.Sprint(tree.Values()) && tree.size != 0 { // if spew.Sprint(gods.Values()) != spew.Sprint(tree.Values()) && tree.size != 0 {
// if gods.String() != tree.String() && gods.Size() != 0 && tree.size != 0 { // // if gods.String() != tree.String() && gods.Size() != 0 && tree.size != 0 {
t.Error(src1) // t.Error(src1)
t.Error(src2) // t.Error(src2)
t.Error(tree.debugString()) // t.Error(tree.debugString())
t.Error(gods.String()) // t.Error(gods.String())
t.Error(l[i]) // t.Error(l[i])
// t.Error(tree.TraversalDepth(-1)) // // t.Error(tree.TraversalDepth(-1))
// t.Error(gods.Values()) // // t.Error(gods.Values())
break ALL // break ALL
} // }
} // }
} // }
} // }
func BenchmarkIterator(b *testing.B) { // func BenchmarkIterator(b *testing.B) {
tree := New(compare.Int) // tree := New(compare.Int)
l := loadTestData() // l := loadTestData()
for _, v := range l { // for _, v := range l {
tree.Put(v) // tree.Put(v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
b.N = 0 // b.N = 0
iter := tree.Iterator() // iter := tree.Iterator()
for iter.Next() { // for iter.Next() {
b.N++ // b.N++
} // }
for iter.Prev() { // for iter.Prev() {
b.N++ // b.N++
} // }
for iter.Next() { // for iter.Next() {
b.N++ // b.N++
} // }
for iter.Prev() { // for iter.Prev() {
b.N++ // b.N++
} // }
} // }
func BenchmarkRemove(b *testing.B) { // func BenchmarkRemove(b *testing.B) {
tree := New(compare.Int) // tree := New(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v) // tree.Put(v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(l); i++ { // for i := 0; i < len(l); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGodsRemove(b *testing.B) { // func BenchmarkGodsRemove(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(l); i++ { // for i := 0; i < len(l); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGodsRBRemove(b *testing.B) { // func BenchmarkGodsRBRemove(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(l); i++ { // for i := 0; i < len(l); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGet(b *testing.B) { // func BenchmarkGet(b *testing.B) {
tree := New(compare.Int) // tree := New(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Put(l[i]) // tree.Put(l[i])
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 10 // execCount := 10
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
tree.Get(v) // tree.Get(v)
} // }
} // }
} // }
func BenchmarkGodsRBGet(b *testing.B) { // func BenchmarkGodsRBGet(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Put(l[i], l[i]) // tree.Put(l[i], l[i])
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 10 // execCount := 10
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
tree.Get(v) // tree.Get(v)
} // }
} // }
} // }
func BenchmarkGodsAvlGet(b *testing.B) { // func BenchmarkGodsAvlGet(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Put(l[i], l[i]) // tree.Put(l[i], l[i])
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 10 // execCount := 10
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
tree.Get(v) // tree.Get(v)
} // }
} // }
} // }
func BenchmarkPut(b *testing.B) { // func BenchmarkPut(b *testing.B) {
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 50 // execCount := 50
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
tree := New(compare.Int) // tree := New(compare.Int)
for _, v := range l { // for _, v := range l {
tree.Put(v) // tree.Put(v)
} // }
} // }
// b.Log(tree.count) // // b.Log(tree.count)
} // }
func BenchmarkGodsRBPut(b *testing.B) { // func BenchmarkGodsRBPut(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
} // }
func BenchmarkGodsPut(b *testing.B) { // func BenchmarkGodsPut(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
} // }

View File

@@ -8,12 +8,7 @@ import (
"testing" "testing"
"github.com/474420502/focus/compare" "github.com/474420502/focus/compare"
"github.com/Pallinder/go-randomdata"
"github.com/davecgh/go-spew/spew" "github.com/davecgh/go-spew/spew"
"github.com/emirpasic/gods/trees/avltree"
"github.com/emirpasic/gods/trees/redblacktree"
"github.com/emirpasic/gods/utils"
) )
func loadTestData() []int { func loadTestData() []int {
@@ -162,32 +157,32 @@ func TestPutStable(t *testing.T) {
// t.Error(tree.debugString(), tree.TraversalBreadth(), "\n", "-----------") // t.Error(tree.debugString(), tree.TraversalBreadth(), "\n", "-----------")
} }
func TestPutComparatorRandom(t *testing.T) { // func TestPutComparatorRandom(t *testing.T) {
for n := 0; n < 300000; n++ { // for n := 0; n < 300000; n++ {
tree := New(compare.Int) // tree := New(compare.Int)
godsavl := avltree.NewWithIntComparator() // godsavl := avltree.NewWithIntComparator()
content := "" // content := ""
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(m) < 10; i++ { // for i := 0; len(m) < 10; i++ {
v := randomdata.Number(0, 65535) // v := randomdata.Number(0, 65535)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
m[v] = v // m[v] = v
content += spew.Sprint(v) + "," // content += spew.Sprint(v) + ","
tree.Put(v) // tree.Put(v)
godsavl.Put(v, v) // godsavl.Put(v, v)
} // }
} // }
if tree.String() != godsavl.String() { // if tree.String() != godsavl.String() {
t.Error(godsavl.String()) // t.Error(godsavl.String())
t.Error(tree.debugString()) // t.Error(tree.debugString())
t.Error(content, n) // t.Error(content, n)
break // break
} // }
} // }
} // }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
tree := New(compare.Int) tree := New(compare.Int)
@@ -227,260 +222,260 @@ func TestGet(t *testing.T) {
} }
func TestRemoveAll(t *testing.T) { // func TestRemoveAll(t *testing.T) {
ALL: // ALL:
for c := 0; c < 5000; c++ { // for c := 0; c < 5000; c++ {
tree := New(compare.Int) // tree := New(compare.Int)
gods := avltree.NewWithIntComparator() // gods := avltree.NewWithIntComparator()
var l []int // var l []int
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(l) < 100; i++ { // for i := 0; len(l) < 100; i++ {
v := randomdata.Number(0, 100000) // v := randomdata.Number(0, 100000)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
m[v] = v // m[v] = v
l = append(l, v) // l = append(l, v)
tree.Put(v) // tree.Put(v)
gods.Put(v, v) // gods.Put(v, v)
} // }
} // }
for i := 0; i < 100; i++ { // for i := 0; i < 100; i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
gods.Remove(l[i]) // gods.Remove(l[i])
s1 := spew.Sprint(tree.Values()) // s1 := spew.Sprint(tree.Values())
s2 := spew.Sprint(gods.Values()) // s2 := spew.Sprint(gods.Values())
if s1 != s2 { // if s1 != s2 {
t.Error("avl remove error", "avlsize = ", tree.Size()) // t.Error("avl remove error", "avlsize = ", tree.Size())
t.Error(s1) // t.Error(s1)
t.Error(s2) // t.Error(s2)
break ALL // break ALL
} // }
} // }
} // }
} // }
func TestRemove(t *testing.T) { // func TestRemove(t *testing.T) {
ALL: // ALL:
for N := 0; N < 500000; N++ { // for N := 0; N < 500000; N++ {
tree := New(compare.Int) // tree := New(compare.Int)
gods := avltree.NewWithIntComparator() // gods := avltree.NewWithIntComparator()
var l []int // var l []int
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(l) < 10; i++ { // for i := 0; len(l) < 10; i++ {
v := randomdata.Number(0, 100) // v := randomdata.Number(0, 100)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
l = append(l, v) // l = append(l, v)
m[v] = v // m[v] = v
tree.Put(v) // tree.Put(v)
gods.Put(v, v) // gods.Put(v, v)
} // }
} // }
src1 := tree.String() // src1 := tree.String()
src2 := gods.String() // src2 := gods.String()
for i := 0; i < 10; i++ { // for i := 0; i < 10; i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
gods.Remove(l[i]) // gods.Remove(l[i])
if spew.Sprint(gods.Values()) != spew.Sprint(tree.Values()) && tree.size != 0 { // if spew.Sprint(gods.Values()) != spew.Sprint(tree.Values()) && tree.size != 0 {
// if gods.String() != tree.String() && gods.Size() != 0 && tree.size != 0 { // // if gods.String() != tree.String() && gods.Size() != 0 && tree.size != 0 {
t.Error(src1) // t.Error(src1)
t.Error(src2) // t.Error(src2)
t.Error(tree.debugString()) // t.Error(tree.debugString())
t.Error(gods.String()) // t.Error(gods.String())
t.Error(l[i]) // t.Error(l[i])
// t.Error(tree.TraversalDepth(-1)) // // t.Error(tree.TraversalDepth(-1))
// t.Error(gods.Values()) // // t.Error(gods.Values())
break ALL // break ALL
} // }
} // }
} // }
} // }
func BenchmarkIterator(b *testing.B) { // func BenchmarkIterator(b *testing.B) {
tree := New(utils.IntComparator) // tree := New(utils.IntComparator)
l := loadTestData() // l := loadTestData()
for _, v := range l { // for _, v := range l {
tree.Put(v) // tree.Put(v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
b.N = 0 // b.N = 0
iter := tree.Iterator() // iter := tree.Iterator()
for iter.Next() { // for iter.Next() {
b.N++ // b.N++
} // }
for iter.Prev() { // for iter.Prev() {
b.N++ // b.N++
} // }
for iter.Next() { // for iter.Next() {
b.N++ // b.N++
} // }
for iter.Prev() { // for iter.Prev() {
b.N++ // b.N++
} // }
} // }
func BenchmarkRemove(b *testing.B) { // func BenchmarkRemove(b *testing.B) {
tree := New(utils.IntComparator) // tree := New(utils.IntComparator)
l := loadTestData() // l := loadTestData()
for _, v := range l { // for _, v := range l {
tree.Put(v) // tree.Put(v)
} // }
ll := tree.Values() // ll := tree.Values()
b.N = len(ll) // b.N = len(ll)
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(ll); i++ { // for i := 0; i < len(ll); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGodsRemove(b *testing.B) { // func BenchmarkGodsRemove(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
ll := tree.Values() // ll := tree.Values()
b.N = len(ll) // b.N = len(ll)
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(ll); i++ { // for i := 0; i < len(ll); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGodsRBRemove(b *testing.B) { // func BenchmarkGodsRBRemove(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
ll := tree.Values() // ll := tree.Values()
b.N = len(ll) // b.N = len(ll)
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(ll); i++ { // for i := 0; i < len(ll); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGet(b *testing.B) { // func BenchmarkGet(b *testing.B) {
tree := New(compare.Int) // tree := New(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Put(l[i]) // tree.Put(l[i])
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 10 // execCount := 10
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
tree.Get(v) // tree.Get(v)
} // }
} // }
} // }
func BenchmarkGodsRBGet(b *testing.B) { // func BenchmarkGodsRBGet(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Get(l[i]) // tree.Get(l[i])
} // }
} // }
func BenchmarkGodsAvlGet(b *testing.B) { // func BenchmarkGodsAvlGet(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Get(l[i]) // tree.Get(l[i])
} // }
} // }
func BenchmarkPut(b *testing.B) { // func BenchmarkPut(b *testing.B) {
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 1000 // execCount := 1000
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
tree := New(compare.Int) // tree := New(compare.Int)
for _, v := range l { // for _, v := range l {
tree.Put(v) // tree.Put(v)
} // }
} // }
// b.Log(tree.count) // // b.Log(tree.count)
} // }
func BenchmarkGodsRBPut(b *testing.B) { // func BenchmarkGodsRBPut(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
} // }
func BenchmarkGodsPut(b *testing.B) { // func BenchmarkGodsPut(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
} // }

View File

@@ -8,10 +8,7 @@ import (
"testing" "testing"
"github.com/474420502/focus/compare" "github.com/474420502/focus/compare"
"github.com/Pallinder/go-randomdata"
"github.com/davecgh/go-spew/spew" "github.com/davecgh/go-spew/spew"
"github.com/emirpasic/gods/trees/avltree"
"github.com/emirpasic/gods/trees/redblacktree"
) )
func loadTestData() []int { func loadTestData() []int {
@@ -226,32 +223,32 @@ func TestPutStable(t *testing.T) {
// t.Error(tree.debugString(), tree.TraversalBreadth(), "\n", "-----------") // t.Error(tree.debugString(), tree.TraversalBreadth(), "\n", "-----------")
} }
func TestPutComparatorRandom(t *testing.T) { // func TestPutComparatorRandom(t *testing.T) {
for n := 0; n < 300000; n++ { // for n := 0; n < 300000; n++ {
tree := New(compare.Int) // tree := New(compare.Int)
godsavl := avltree.NewWithIntComparator() // godsavl := avltree.NewWithIntComparator()
content := "" // content := ""
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(m) < 10; i++ { // for i := 0; len(m) < 10; i++ {
v := randomdata.Number(0, 65535) // v := randomdata.Number(0, 65535)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
m[v] = v // m[v] = v
content += spew.Sprint(v) + "," // content += spew.Sprint(v) + ","
tree.Put(v, v) // tree.Put(v, v)
godsavl.Put(v, v) // godsavl.Put(v, v)
} // }
} // }
if tree.String() != godsavl.String() { // if tree.String() != godsavl.String() {
t.Error(godsavl.String()) // t.Error(godsavl.String())
t.Error(tree.debugString()) // t.Error(tree.debugString())
t.Error(content, n) // t.Error(content, n)
break // break
} // }
} // }
} // }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
tree := New(compare.Int) tree := New(compare.Int)
@@ -291,230 +288,230 @@ func TestGet(t *testing.T) {
} }
func TestRemoveAll(t *testing.T) { // func TestRemoveAll(t *testing.T) {
ALL: // ALL:
for c := 0; c < 50000; c++ { // for c := 0; c < 50000; c++ {
tree := New(compare.Int) // tree := New(compare.Int)
gods := avltree.NewWithIntComparator() // gods := avltree.NewWithIntComparator()
var l []int // var l []int
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(l) < 50; i++ { // for i := 0; len(l) < 50; i++ {
v := randomdata.Number(0, 100000) // v := randomdata.Number(0, 100000)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
m[v] = v // m[v] = v
l = append(l, v) // l = append(l, v)
tree.Put(v, v) // tree.Put(v, v)
gods.Put(v, v) // gods.Put(v, v)
} // }
} // }
for i := 0; i < 50; i++ { // for i := 0; i < 50; i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
gods.Remove(l[i]) // gods.Remove(l[i])
s1 := spew.Sprint(tree.Values()) // s1 := spew.Sprint(tree.Values())
s2 := spew.Sprint(gods.Values()) // s2 := spew.Sprint(gods.Values())
if s1 != s2 { // if s1 != s2 {
t.Error("avl remove error", "avlsize = ", tree.Size()) // t.Error("avl remove error", "avlsize = ", tree.Size())
t.Error(s1) // t.Error(s1)
t.Error(s2) // t.Error(s2)
break ALL // break ALL
} // }
} // }
} // }
} // }
func TestRemove(t *testing.T) { // func TestRemove(t *testing.T) {
ALL: // ALL:
for N := 0; N < 500000; N++ { // for N := 0; N < 500000; N++ {
tree := New(compare.Int) // tree := New(compare.Int)
gods := avltree.NewWithIntComparator() // gods := avltree.NewWithIntComparator()
var l []int // var l []int
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(l) < 10; i++ { // for i := 0; len(l) < 10; i++ {
v := randomdata.Number(0, 100) // v := randomdata.Number(0, 100)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
l = append(l, v) // l = append(l, v)
m[v] = v // m[v] = v
tree.Put(v, v) // tree.Put(v, v)
gods.Put(v, v) // gods.Put(v, v)
} // }
} // }
src1 := tree.String() // src1 := tree.String()
src2 := gods.String() // src2 := gods.String()
for i := 0; i < 10; i++ { // for i := 0; i < 10; i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
gods.Remove(l[i]) // gods.Remove(l[i])
if spew.Sprint(gods.Values()) != spew.Sprint(tree.Values()) && tree.size != 0 { // if spew.Sprint(gods.Values()) != spew.Sprint(tree.Values()) && tree.size != 0 {
// if gods.String() != tree.String() && gods.Size() != 0 && tree.size != 0 { // // if gods.String() != tree.String() && gods.Size() != 0 && tree.size != 0 {
t.Error(src1) // t.Error(src1)
t.Error(src2) // t.Error(src2)
t.Error(tree.debugString()) // t.Error(tree.debugString())
t.Error(gods.String()) // t.Error(gods.String())
t.Error(l[i]) // t.Error(l[i])
// t.Error(tree.TraversalDepth(-1)) // // t.Error(tree.TraversalDepth(-1))
// t.Error(gods.Values()) // // t.Error(gods.Values())
break ALL // break ALL
} // }
} // }
} // }
} // }
func BenchmarkIterator(b *testing.B) { // func BenchmarkIterator(b *testing.B) {
tree := New(compare.Int) // tree := New(compare.Int)
l := loadTestData() // l := loadTestData()
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
b.N = 0 // b.N = 0
iter := tree.Iterator() // iter := tree.Iterator()
for iter.Next() { // for iter.Next() {
b.N++ // b.N++
} // }
for iter.Prev() { // for iter.Prev() {
b.N++ // b.N++
} // }
for iter.Next() { // for iter.Next() {
b.N++ // b.N++
} // }
for iter.Prev() { // for iter.Prev() {
b.N++ // b.N++
} // }
} // }
func BenchmarkRemove(b *testing.B) { // func BenchmarkRemove(b *testing.B) {
tree := New(compare.Int) // tree := New(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(l); i++ { // for i := 0; i < len(l); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGodsRemove(b *testing.B) { // func BenchmarkGodsRemove(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(l); i++ { // for i := 0; i < len(l); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGodsRBRemove(b *testing.B) { // func BenchmarkGodsRBRemove(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(l); i++ { // for i := 0; i < len(l); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGet(b *testing.B) { // func BenchmarkGet(b *testing.B) {
tree := New(compare.Int) // tree := New(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Put(l[i], l[i]) // tree.Put(l[i], l[i])
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 10 // execCount := 10
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
tree.Get(v) // tree.Get(v)
} // }
} // }
} // }
func BenchmarkGodsRBGet(b *testing.B) { // func BenchmarkGodsRBGet(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Put(l[i], l[i]) // tree.Put(l[i], l[i])
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 10 // execCount := 10
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
tree.Get(v) // tree.Get(v)
} // }
} // }
} // }
func BenchmarkGodsAvlGet(b *testing.B) { // func BenchmarkGodsAvlGet(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Put(l[i], l[i]) // tree.Put(l[i], l[i])
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 10 // execCount := 10
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
tree.Get(v) // tree.Get(v)
} // }
} // }
} // }
func BenchmarkPut(b *testing.B) { func BenchmarkPut(b *testing.B) {
@@ -534,30 +531,30 @@ func BenchmarkPut(b *testing.B) {
// b.Log(tree.count) // b.Log(tree.count)
} }
func BenchmarkGodsRBPut(b *testing.B) { // func BenchmarkGodsRBPut(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
} // }
func BenchmarkGodsPut(b *testing.B) { // func BenchmarkGodsPut(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
} // }

View File

@@ -8,12 +8,7 @@ import (
"testing" "testing"
"github.com/474420502/focus/compare" "github.com/474420502/focus/compare"
"github.com/Pallinder/go-randomdata"
"github.com/davecgh/go-spew/spew" "github.com/davecgh/go-spew/spew"
"github.com/emirpasic/gods/trees/avltree"
"github.com/emirpasic/gods/trees/redblacktree"
"github.com/emirpasic/gods/utils"
) )
func loadTestData() []int { func loadTestData() []int {
@@ -162,32 +157,32 @@ func TestPutStable(t *testing.T) {
// t.Error(tree.debugString(), tree.TraversalBreadth(), "\n", "-----------") // t.Error(tree.debugString(), tree.TraversalBreadth(), "\n", "-----------")
} }
func TestPutComparatorRandom(t *testing.T) { // func TestPutComparatorRandom(t *testing.T) {
for n := 0; n < 300000; n++ { // for n := 0; n < 300000; n++ {
tree := New(compare.Int) // tree := New(compare.Int)
godsavl := avltree.NewWithIntComparator() // godsavl := avltree.NewWithIntComparator()
content := "" // content := ""
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(m) < 10; i++ { // for i := 0; len(m) < 10; i++ {
v := randomdata.Number(0, 65535) // v := randomdata.Number(0, 65535)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
m[v] = v // m[v] = v
content += spew.Sprint(v) + "," // content += spew.Sprint(v) + ","
tree.Put(v, v) // tree.Put(v, v)
godsavl.Put(v, v) // godsavl.Put(v, v)
} // }
} // }
if tree.String() != godsavl.String() { // if tree.String() != godsavl.String() {
t.Error(godsavl.String()) // t.Error(godsavl.String())
t.Error(tree.debugString()) // t.Error(tree.debugString())
t.Error(content, n) // t.Error(content, n)
break // break
} // }
} // }
} // }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
tree := New(compare.Int) tree := New(compare.Int)
@@ -227,260 +222,260 @@ func TestGet(t *testing.T) {
} }
func TestRemoveAll(t *testing.T) { // func TestRemoveAll(t *testing.T) {
ALL: // ALL:
for c := 0; c < 5000; c++ { // for c := 0; c < 5000; c++ {
tree := New(compare.Int) // tree := New(compare.Int)
gods := avltree.NewWithIntComparator() // gods := avltree.NewWithIntComparator()
var l []int // var l []int
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(l) < 100; i++ { // for i := 0; len(l) < 100; i++ {
v := randomdata.Number(0, 100000) // v := randomdata.Number(0, 100000)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
m[v] = v // m[v] = v
l = append(l, v) // l = append(l, v)
tree.Put(v, v) // tree.Put(v, v)
gods.Put(v, v) // gods.Put(v, v)
} // }
} // }
for i := 0; i < 100; i++ { // for i := 0; i < 100; i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
gods.Remove(l[i]) // gods.Remove(l[i])
s1 := spew.Sprint(tree.Values()) // s1 := spew.Sprint(tree.Values())
s2 := spew.Sprint(gods.Values()) // s2 := spew.Sprint(gods.Values())
if s1 != s2 { // if s1 != s2 {
t.Error("avl remove error", "avlsize = ", tree.Size()) // t.Error("avl remove error", "avlsize = ", tree.Size())
t.Error(s1) // t.Error(s1)
t.Error(s2) // t.Error(s2)
break ALL // break ALL
} // }
} // }
} // }
} // }
func TestRemove(t *testing.T) { // func TestRemove(t *testing.T) {
ALL: // ALL:
for N := 0; N < 500000; N++ { // for N := 0; N < 500000; N++ {
tree := New(compare.Int) // tree := New(compare.Int)
gods := avltree.NewWithIntComparator() // gods := avltree.NewWithIntComparator()
var l []int // var l []int
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(l) < 10; i++ { // for i := 0; len(l) < 10; i++ {
v := randomdata.Number(0, 100) // v := randomdata.Number(0, 100)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
l = append(l, v) // l = append(l, v)
m[v] = v // m[v] = v
tree.Put(v, v) // tree.Put(v, v)
gods.Put(v, v) // gods.Put(v, v)
} // }
} // }
src1 := tree.String() // src1 := tree.String()
src2 := gods.String() // src2 := gods.String()
for i := 0; i < 10; i++ { // for i := 0; i < 10; i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
gods.Remove(l[i]) // gods.Remove(l[i])
if spew.Sprint(gods.Values()) != spew.Sprint(tree.Values()) && tree.size != 0 { // if spew.Sprint(gods.Values()) != spew.Sprint(tree.Values()) && tree.size != 0 {
// if gods.String() != tree.String() && gods.Size() != 0 && tree.size != 0 { // // if gods.String() != tree.String() && gods.Size() != 0 && tree.size != 0 {
t.Error(src1) // t.Error(src1)
t.Error(src2) // t.Error(src2)
t.Error(tree.debugString()) // t.Error(tree.debugString())
t.Error(gods.String()) // t.Error(gods.String())
t.Error(l[i]) // t.Error(l[i])
// t.Error(tree.TraversalDepth(-1)) // // t.Error(tree.TraversalDepth(-1))
// t.Error(gods.Values()) // // t.Error(gods.Values())
break ALL // break ALL
} // }
} // }
} // }
} // }
func BenchmarkIterator(b *testing.B) { // func BenchmarkIterator(b *testing.B) {
tree := New(utils.IntComparator) // tree := New(utils.IntComparator)
l := loadTestData() // l := loadTestData()
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
b.N = 0 // b.N = 0
iter := tree.Iterator() // iter := tree.Iterator()
for iter.Next() { // for iter.Next() {
b.N++ // b.N++
} // }
for iter.Prev() { // for iter.Prev() {
b.N++ // b.N++
} // }
for iter.Next() { // for iter.Next() {
b.N++ // b.N++
} // }
for iter.Prev() { // for iter.Prev() {
b.N++ // b.N++
} // }
} // }
func BenchmarkRemove(b *testing.B) { // func BenchmarkRemove(b *testing.B) {
tree := New(utils.IntComparator) // tree := New(utils.IntComparator)
l := loadTestData() // l := loadTestData()
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
ll := tree.Values() // ll := tree.Values()
b.N = len(ll) // b.N = len(ll)
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(ll); i++ { // for i := 0; i < len(ll); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGodsRemove(b *testing.B) { // func BenchmarkGodsRemove(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
ll := tree.Values() // ll := tree.Values()
b.N = len(ll) // b.N = len(ll)
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(ll); i++ { // for i := 0; i < len(ll); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGodsRBRemove(b *testing.B) { // func BenchmarkGodsRBRemove(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
ll := tree.Values() // ll := tree.Values()
b.N = len(ll) // b.N = len(ll)
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(ll); i++ { // for i := 0; i < len(ll); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGet(b *testing.B) { // func BenchmarkGet(b *testing.B) {
tree := New(compare.Int) // tree := New(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Put(l[i], l[i]) // tree.Put(l[i], l[i])
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 10 // execCount := 10
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
tree.Get(v) // tree.Get(v)
} // }
} // }
} // }
func BenchmarkGodsRBGet(b *testing.B) { // func BenchmarkGodsRBGet(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Get(l[i]) // tree.Get(l[i])
} // }
} // }
func BenchmarkGodsAvlGet(b *testing.B) { // func BenchmarkGodsAvlGet(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Get(l[i]) // tree.Get(l[i])
} // }
} // }
func BenchmarkPut(b *testing.B) { // func BenchmarkPut(b *testing.B) {
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 1000 // execCount := 1000
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
tree := New(compare.Int) // tree := New(compare.Int)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
} // }
// b.Log(tree.count) // // b.Log(tree.count)
} // }
func BenchmarkGodsRBPut(b *testing.B) { // func BenchmarkGodsRBPut(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
} // }
func BenchmarkGodsPut(b *testing.B) { // func BenchmarkGodsPut(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
} // }

View File

@@ -8,12 +8,8 @@ import (
"testing" "testing"
"github.com/474420502/focus/compare" "github.com/474420502/focus/compare"
"github.com/huandu/skiplist"
"github.com/Pallinder/go-randomdata"
"github.com/davecgh/go-spew/spew" "github.com/davecgh/go-spew/spew"
"github.com/emirpasic/gods/trees/avltree"
"github.com/emirpasic/gods/trees/redblacktree"
) )
func loadTestData() []int { func loadTestData() []int {
@@ -156,35 +152,35 @@ func TestGetAround(t *testing.T) {
// // for test error case // // for test error case
func TestPutComparatorRandom(t *testing.T) { // func TestPutComparatorRandom(t *testing.T) {
for n := 0; n < 100000; n++ { // for n := 0; n < 100000; n++ {
tree := New(compare.Int) // tree := New(compare.Int)
godsavl := avltree.NewWithIntComparator() // godsavl := avltree.NewWithIntComparator()
content := "" // content := ""
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(m) < 20; i++ { // for i := 0; len(m) < 20; i++ {
v := randomdata.Number(0, 65535) // v := randomdata.Number(0, 65535)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
m[v] = v // m[v] = v
content += spew.Sprint(v) + "," // content += spew.Sprint(v) + ","
tree.Put(v) // tree.Put(v)
godsavl.Put(v, v) // godsavl.Put(v, v)
} // }
} // }
s1 := spew.Sprint(tree.Values()) // s1 := spew.Sprint(tree.Values())
s2 := spew.Sprint(godsavl.Values()) // s2 := spew.Sprint(godsavl.Values())
if s1 != s2 { // if s1 != s2 {
t.Error(godsavl.String()) // t.Error(godsavl.String())
t.Error(tree.debugString()) // t.Error(tree.debugString())
t.Error(content, n) // t.Error(content, n)
break // break
} // }
} // }
} // }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
tree := New(compare.Int) tree := New(compare.Int)
@@ -284,373 +280,373 @@ func TestTravalsal(t *testing.T) {
} }
func TestRemoveAll(t *testing.T) { // func TestRemoveAll(t *testing.T) {
ALL: // ALL:
for c := 0; c < 10000; c++ { // for c := 0; c < 10000; c++ {
tree := New(compare.Int) // tree := New(compare.Int)
gods := avltree.NewWithIntComparator() // gods := avltree.NewWithIntComparator()
var l []int // var l []int
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(l) < 100; i++ { // for i := 0; len(l) < 100; i++ {
v := randomdata.Number(0, 100000) // v := randomdata.Number(0, 100000)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
m[v] = v // m[v] = v
l = append(l, v) // l = append(l, v)
tree.Put(v) // tree.Put(v)
gods.Put(v, v) // gods.Put(v, v)
} // }
} // }
for i := 0; i < 100; i++ { // for i := 0; i < 100; i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
gods.Remove(l[i]) // gods.Remove(l[i])
s1 := spew.Sprint(tree.Values()) // s1 := spew.Sprint(tree.Values())
s2 := spew.Sprint(gods.Values()) // s2 := spew.Sprint(gods.Values())
if s1 != s2 { // if s1 != s2 {
t.Error("avl remove error", "avlsize = ", tree.Size()) // t.Error("avl remove error", "avlsize = ", tree.Size())
t.Error(tree.root, i, l[i]) // t.Error(tree.root, i, l[i])
t.Error(s1) // t.Error(s1)
t.Error(s2) // t.Error(s2)
break ALL // break ALL
} // }
} // }
} // }
} // }
func TestRemove(t *testing.T) { // func TestRemove(t *testing.T) {
ALL: // ALL:
for N := 0; N < 5000; N++ { // for N := 0; N < 5000; N++ {
tree := New(compare.Int) // tree := New(compare.Int)
gods := avltree.NewWithIntComparator() // gods := avltree.NewWithIntComparator()
var l []int // var l []int
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(l) < 20; i++ { // for i := 0; len(l) < 20; i++ {
v := randomdata.Number(0, 100) // v := randomdata.Number(0, 100)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
l = append(l, v) // l = append(l, v)
m[v] = v // m[v] = v
tree.Put(v) // tree.Put(v)
gods.Put(v, v) // gods.Put(v, v)
} // }
} // }
src1 := tree.String() // src1 := tree.String()
src2 := gods.String() // src2 := gods.String()
for i := 0; i < 20; i++ { // for i := 0; i < 20; i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
gods.Remove(l[i]) // gods.Remove(l[i])
if tree.root != nil && spew.Sprint(gods.Values()) != spew.Sprint(tree.Values()) { // if tree.root != nil && spew.Sprint(gods.Values()) != spew.Sprint(tree.Values()) {
t.Error(src1) // t.Error(src1)
t.Error(src2) // t.Error(src2)
t.Error(tree.debugString()) // t.Error(tree.debugString())
t.Error(gods.String()) // t.Error(gods.String())
t.Error(l[i]) // t.Error(l[i])
break ALL // break ALL
} // }
} // }
} // }
} // }
func BenchmarkSkipRemove(b *testing.B) { // func BenchmarkSkipRemove(b *testing.B) {
sl := skiplist.New(skiplist.Int) // sl := skiplist.New(skiplist.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
sl.Set(v, v) // sl.Set(v, v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for _, v := range l { // for _, v := range l {
sl.Remove(v) // sl.Remove(v)
} // }
} // }
func BenchmarkSkipListGet(b *testing.B) { // func BenchmarkSkipListGet(b *testing.B) {
sl := skiplist.New(skiplist.Int) // sl := skiplist.New(skiplist.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
sl.Set(v, v) // sl.Set(v, v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 5 // execCount := 5
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
e := sl.Get(v) // e := sl.Get(v)
var result [50]interface{} // var result [50]interface{}
for i := 0; i < 50 && e != nil; i++ { // for i := 0; i < 50 && e != nil; i++ {
result[i] = e.Value // result[i] = e.Value
e = e.Next() // e = e.Next()
} // }
} // }
} // }
} // }
func BenchmarkGetRange(b *testing.B) { // func BenchmarkGetRange(b *testing.B) {
} // }
func BenchmarkIndexRange(b *testing.B) { // func BenchmarkIndexRange(b *testing.B) {
tree := New(compare.Int) // tree := New(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v) // tree.Put(v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 5 // execCount := 5
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for range l { // for range l {
tree.IndexRange(i, i+49) // tree.IndexRange(i, i+49)
} // }
} // }
} // }
func BenchmarkSkipListSet(b *testing.B) { // func BenchmarkSkipListSet(b *testing.B) {
l := loadTestData() // l := loadTestData()
execCount := 1 // execCount := 1
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
sl := skiplist.New(skiplist.Int) // sl := skiplist.New(skiplist.Int)
for _, v := range l { // for _, v := range l {
sl.Set(v, v) // sl.Set(v, v)
} // }
} // }
} // }
func BenchmarkIterator(b *testing.B) { // func BenchmarkIterator(b *testing.B) {
tree := New(compare.Int) // tree := New(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v) // tree.Put(v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
iter := tree.Iterator() // iter := tree.Iterator()
b.N = 0 // b.N = 0
for iter.Next() { // for iter.Next() {
b.N++ // b.N++
} // }
for iter.Prev() { // for iter.Prev() {
b.N++ // b.N++
} // }
for iter.Next() { // for iter.Next() {
b.N++ // b.N++
} // }
b.Log(b.N, len(l)) // b.Log(b.N, len(l))
} // }
func BenchmarkRemove(b *testing.B) { // func BenchmarkRemove(b *testing.B) {
tree := New(compare.Int) // tree := New(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v) // tree.Put(v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(l); i++ { // for i := 0; i < len(l); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGodsRemove(b *testing.B) { // func BenchmarkGodsRemove(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(l); i++ { // for i := 0; i < len(l); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGodsRBRemove(b *testing.B) { // func BenchmarkGodsRBRemove(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < len(l); i++ { // for i := 0; i < len(l); i++ {
tree.Remove(l[i]) // tree.Remove(l[i])
} // }
} // }
func BenchmarkGet(b *testing.B) { // func BenchmarkGet(b *testing.B) {
tree := New(compare.Int) // tree := New(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Put(l[i]) // tree.Put(l[i])
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 10 // execCount := 10
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
tree.Get(v) // tree.Get(v)
} // }
} // }
} // }
func BenchmarkGodsRBGet(b *testing.B) { // func BenchmarkGodsRBGet(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Put(l[i], i) // tree.Put(l[i], i)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 10 // execCount := 10
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
tree.Get(v) // tree.Get(v)
} // }
} // }
} // }
func BenchmarkGodsAvlGet(b *testing.B) { // func BenchmarkGodsAvlGet(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Put(l[i], i) // tree.Put(l[i], i)
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 10 // execCount := 10
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
for _, v := range l { // for _, v := range l {
tree.Get(v) // tree.Get(v)
} // }
} // }
} // }
func BenchmarkPut(b *testing.B) { // func BenchmarkPut(b *testing.B) {
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
execCount := 50 // execCount := 50
b.N = len(l) * execCount // b.N = len(l) * execCount
for i := 0; i < execCount; i++ { // for i := 0; i < execCount; i++ {
tree := New(compare.Int) // tree := New(compare.Int)
for _, v := range l { // for _, v := range l {
tree.Put(v) // tree.Put(v)
} // }
} // }
} // }
func TestPutStable(t *testing.T) { // func TestPutStable(t *testing.T) {
} // }
func BenchmarkIndex(b *testing.B) { // func BenchmarkIndex(b *testing.B) {
tree := New(compare.Int) // tree := New(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l) // b.N = len(l)
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Put(l[i]) // tree.Put(l[i])
} // }
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
for i := 0; i < b.N; i++ { // for i := 0; i < b.N; i++ {
tree.Index(i) // tree.Index(i)
} // }
} // }
func BenchmarkGodsRBPut(b *testing.B) { // func BenchmarkGodsRBPut(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := redblacktree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
} // }
func BenchmarkGodsPut(b *testing.B) { // func BenchmarkGodsPut(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.ResetTimer() // b.ResetTimer()
b.StartTimer() // b.StartTimer()
b.N = len(l) // b.N = len(l)
for _, v := range l { // for _, v := range l {
tree.Put(v, v) // tree.Put(v, v)
} // }
} // }

View File

@@ -8,12 +8,8 @@ import (
"testing" "testing"
"github.com/474420502/focus/compare" "github.com/474420502/focus/compare"
"github.com/huandu/skiplist"
"github.com/Pallinder/go-randomdata"
"github.com/davecgh/go-spew/spew" "github.com/davecgh/go-spew/spew"
"github.com/emirpasic/gods/trees/avltree"
"github.com/emirpasic/gods/trees/redblacktree"
) )
func loadTestData() []int { func loadTestData() []int {
@@ -156,35 +152,35 @@ func TestGetAround(t *testing.T) {
// // for test error case // // for test error case
func TestPutComparatorRandom(t *testing.T) { // func TestPutComparatorRandom(t *testing.T) {
for n := 0; n < 300000; n++ { // for n := 0; n < 300000; n++ {
tree := New(compare.Int) // tree := New(compare.Int)
godsavl := avltree.NewWithIntComparator() // godsavl := avltree.NewWithIntComparator()
content := "" // content := ""
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(m) < 10; i++ { // for i := 0; len(m) < 10; i++ {
v := randomdata.Number(0, 65535) // v := randomdata.Number(0, 65535)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
m[v] = v // m[v] = v
content += spew.Sprint(v) + "," // content += spew.Sprint(v) + ","
tree.Put(v, v) // tree.Put(v, v)
godsavl.Put(v, v) // godsavl.Put(v, v)
} // }
} // }
s1 := spew.Sprint(tree.Values()) // s1 := spew.Sprint(tree.Values())
s2 := spew.Sprint(godsavl.Values()) // s2 := spew.Sprint(godsavl.Values())
if s1 != s2 { // if s1 != s2 {
t.Error(godsavl.String()) // t.Error(godsavl.String())
t.Error(tree.debugString()) // t.Error(tree.debugString())
t.Error(content, n) // t.Error(content, n)
break // break
} // }
} // }
} // }
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
tree := New(compare.Int) tree := New(compare.Int)
@@ -284,340 +280,340 @@ func TestTravalsal(t *testing.T) {
} }
func TestRemoveAll(t *testing.T) { // func TestRemoveAll(t *testing.T) {
ALL: // ALL:
for c := 0; c < 5000; c++ { // for c := 0; c < 5000; c++ {
tree := New(compare.Int) // tree := New(compare.Int)
gods := avltree.NewWithIntComparator() // gods := avltree.NewWithIntComparator()
var l []int // var l []int
m := make(map[int]int) // m := make(map[int]int)
for i := 0; len(l) < 50; i++ { // for i := 0; len(l) < 50; i++ {
v := randomdata.Number(0, 100000) // v := randomdata.Number(0, 100000)
if _, ok := m[v]; !ok { // if _, ok := m[v]; !ok {
m[v] = v // m[v] = v
l = append(l, v) // l = append(l, v)
tree.Put(v, v) // tree.Put(v, v)
gods.Put(v, v) // gods.Put(v, v)
} // }
}
for i := 0; i < 50; i++ {
tree.Remove(l[i])
gods.Remove(l[i])
s1 := spew.Sprint(tree.Values())
s2 := spew.Sprint(gods.Values())
if s1 != s2 {
t.Error("avl remove error", "avlsize = ", tree.Size())
t.Error(tree.root, i, l[i])
t.Error(s1)
t.Error(s2)
break ALL
}
}
}
}
func TestRemove(t *testing.T) {
ALL:
for N := 0; N < 5000; N++ {
tree := New(compare.Int)
gods := avltree.NewWithIntComparator()
var l []int
m := make(map[int]int)
for i := 0; len(l) < 20; i++ {
v := randomdata.Number(0, 100)
if _, ok := m[v]; !ok {
l = append(l, v)
m[v] = v
tree.Put(v, v)
gods.Put(v, v)
}
}
src1 := tree.String()
src2 := gods.String()
for i := 0; i < 20; i++ {
tree.Remove(l[i])
gods.Remove(l[i])
if tree.root != nil && spew.Sprint(gods.Values()) != spew.Sprint(tree.Values()) {
t.Error(src1)
t.Error(src2)
t.Error(tree.debugString())
t.Error(gods.String())
t.Error(l[i])
break ALL
}
}
}
}
func BenchmarkGetRange(b *testing.B) {
}
func BenchmarkIndexRange(b *testing.B) {
tree := New(compare.Int)
l := loadTestData()
b.N = len(l)
for _, v := range l {
tree.Put(v, v)
}
b.ResetTimer()
b.StartTimer()
execCount := 5
b.N = len(l) * execCount
for i := 0; i < execCount; i++ {
for range l {
tree.IndexRange(i, i+49)
}
}
}
func BenchmarkSkipListGet(b *testing.B) {
sl := skiplist.New(skiplist.Int)
l := loadTestData()
b.N = len(l)
for _, v := range l {
sl.Set(v, v)
}
b.ResetTimer()
b.StartTimer()
execCount := 5
b.N = len(l) * execCount
for i := 0; i < execCount; i++ {
for _, v := range l {
sl.Get(v)
// e := sl.Get(v)
// var result [50]interface{}
// for i := 0; i < 50 && e != nil; i++ {
// result[i] = e.Value
// e = e.Next()
// } // }
}
}
}
func BenchmarkSkipListSet(b *testing.B) { // for i := 0; i < 50; i++ {
l := loadTestData() // tree.Remove(l[i])
execCount := 1 // gods.Remove(l[i])
b.N = len(l) * execCount
for i := 0; i < execCount; i++ {
sl := skiplist.New(skiplist.Int)
for _, v := range l {
sl.Set(v, v)
}
}
}
func BenchmarkIterator(b *testing.B) { // s1 := spew.Sprint(tree.Values())
tree := New(compare.Int) // s2 := spew.Sprint(gods.Values())
// if s1 != s2 {
// t.Error("avl remove error", "avlsize = ", tree.Size())
// t.Error(tree.root, i, l[i])
// t.Error(s1)
// t.Error(s2)
// break ALL
// }
// }
// }
// }
l := loadTestData() // func TestRemove(t *testing.T) {
b.N = len(l)
for _, v := range l { // ALL:
tree.Put(v, v) // for N := 0; N < 5000; N++ {
} // tree := New(compare.Int)
// gods := avltree.NewWithIntComparator()
b.ResetTimer() // var l []int
b.StartTimer() // m := make(map[int]int)
iter := tree.Iterator()
b.N = 0
for iter.Next() {
b.N++
}
for iter.Prev() {
b.N++
}
for iter.Next() {
b.N++
}
b.Log(b.N, len(l))
}
func BenchmarkRemove(b *testing.B) { // for i := 0; len(l) < 20; i++ {
tree := New(compare.Int) // v := randomdata.Number(0, 100)
// if _, ok := m[v]; !ok {
// l = append(l, v)
// m[v] = v
// tree.Put(v, v)
// gods.Put(v, v)
// }
// }
l := loadTestData() // src1 := tree.String()
// src2 := gods.String()
b.N = len(l) // for i := 0; i < 20; i++ {
for _, v := range l { // tree.Remove(l[i])
tree.Put(v, v) // gods.Remove(l[i])
} // if tree.root != nil && spew.Sprint(gods.Values()) != spew.Sprint(tree.Values()) {
// t.Error(src1)
// t.Error(src2)
// t.Error(tree.debugString())
// t.Error(gods.String())
// t.Error(l[i])
// break ALL
// }
// }
// }
// }
b.ResetTimer() // func BenchmarkGetRange(b *testing.B) {
b.StartTimer()
for i := 0; i < len(l); i++ { // }
tree.Remove(l[i])
}
}
func BenchmarkGodsRemove(b *testing.B) { // func BenchmarkIndexRange(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := New(compare.Int)
// l := loadTestData()
// b.N = len(l)
l := loadTestData() // for _, v := range l {
// tree.Put(v, v)
// }
b.N = len(l) // b.ResetTimer()
for _, v := range l { // b.StartTimer()
tree.Put(v, v)
}
b.ResetTimer() // execCount := 5
b.StartTimer() // b.N = len(l) * execCount
for i := 0; i < len(l); i++ { // for i := 0; i < execCount; i++ {
tree.Remove(l[i]) // for range l {
} // tree.IndexRange(i, i+49)
} // }
// }
// }
func BenchmarkGodsRBRemove(b *testing.B) { // func BenchmarkSkipListGet(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // sl := skiplist.New(skiplist.Int)
// l := loadTestData()
// b.N = len(l)
l := loadTestData() // for _, v := range l {
// sl.Set(v, v)
// }
b.N = len(l) // b.ResetTimer()
for _, v := range l { // b.StartTimer()
tree.Put(v, v)
}
b.ResetTimer() // execCount := 5
b.StartTimer() // b.N = len(l) * execCount
for i := 0; i < len(l); i++ { // for i := 0; i < execCount; i++ {
tree.Remove(l[i]) // for _, v := range l {
} // sl.Get(v)
} // // e := sl.Get(v)
// // var result [50]interface{}
// // for i := 0; i < 50 && e != nil; i++ {
// // result[i] = e.Value
// // e = e.Next()
// // }
// }
// }
// }
func BenchmarkGet(b *testing.B) { // func BenchmarkSkipListSet(b *testing.B) {
tree := New(compare.Int) // l := loadTestData()
// execCount := 1
// b.N = len(l) * execCount
// for i := 0; i < execCount; i++ {
// sl := skiplist.New(skiplist.Int)
// for _, v := range l {
// sl.Set(v, v)
// }
// }
// }
l := loadTestData() // func BenchmarkIterator(b *testing.B) {
b.N = len(l) // tree := New(compare.Int)
for i := 0; i < b.N; i++ {
tree.Put(l[i], i)
}
b.ResetTimer() // l := loadTestData()
b.StartTimer() // b.N = len(l)
execCount := 10 // for _, v := range l {
b.N = len(l) * execCount // tree.Put(v, v)
// }
for i := 0; i < execCount; i++ { // b.ResetTimer()
for _, v := range l { // b.StartTimer()
tree.Get(v) // iter := tree.Iterator()
} // b.N = 0
} // for iter.Next() {
} // b.N++
// }
// for iter.Prev() {
// b.N++
// }
// for iter.Next() {
// b.N++
// }
// b.Log(b.N, len(l))
// }
func BenchmarkGodsRBGet(b *testing.B) { // func BenchmarkRemove(b *testing.B) {
tree := redblacktree.NewWithIntComparator() // tree := New(compare.Int)
l := loadTestData() // l := loadTestData()
b.N = len(l)
for i := 0; i < b.N; i++ {
tree.Put(l[i], i)
}
b.ResetTimer() // b.N = len(l)
b.StartTimer() // for _, v := range l {
// tree.Put(v, v)
// }
execCount := 10 // b.ResetTimer()
b.N = len(l) * execCount // b.StartTimer()
for i := 0; i < execCount; i++ { // for i := 0; i < len(l); i++ {
for _, v := range l { // tree.Remove(l[i])
tree.Get(v) // }
} // }
}
}
func BenchmarkGodsAvlGet(b *testing.B) { // func BenchmarkGodsRemove(b *testing.B) {
tree := avltree.NewWithIntComparator() // tree := avltree.NewWithIntComparator()
l := loadTestData() // l := loadTestData()
b.N = len(l)
for i := 0; i < b.N; i++ {
tree.Put(l[i], i)
}
b.ResetTimer() // b.N = len(l)
b.StartTimer() // for _, v := range l {
// tree.Put(v, v)
// }
execCount := 10 // b.ResetTimer()
b.N = len(l) * execCount // b.StartTimer()
for i := 0; i < execCount; i++ { // for i := 0; i < len(l); i++ {
for _, v := range l { // tree.Remove(l[i])
tree.Get(v) // }
} // }
}
}
func BenchmarkPut(b *testing.B) { // func BenchmarkGodsRBRemove(b *testing.B) {
l := loadTestData() // tree := redblacktree.NewWithIntComparator()
b.ResetTimer() // l := loadTestData()
b.StartTimer()
execCount := 50 // b.N = len(l)
b.N = len(l) * execCount // for _, v := range l {
for i := 0; i < execCount; i++ { // tree.Put(v, v)
tree := New(compare.Int) // }
for _, v := range l {
tree.Put(v, v)
}
}
}
func TestPutStable(t *testing.T) { // b.ResetTimer()
// b.StartTimer()
} // for i := 0; i < len(l); i++ {
// tree.Remove(l[i])
// }
// }
func BenchmarkGodsRBPut(b *testing.B) { // func BenchmarkGet(b *testing.B) {
l := loadTestData()
b.ResetTimer() // tree := New(compare.Int)
b.StartTimer()
execCount := 50 // l := loadTestData()
b.N = len(l) * execCount // b.N = len(l)
for i := 0; i < execCount; i++ { // for i := 0; i < b.N; i++ {
tree := redblacktree.NewWithIntComparator() // tree.Put(l[i], i)
for _, v := range l { // }
tree.Put(v, v)
}
}
}
func BenchmarkGodsPut(b *testing.B) { // b.ResetTimer()
tree := avltree.NewWithIntComparator() // b.StartTimer()
l := loadTestData() // execCount := 10
// b.N = len(l) * execCount
b.ResetTimer() // for i := 0; i < execCount; i++ {
b.StartTimer() // for _, v := range l {
// tree.Get(v)
// }
// }
// }
b.N = len(l) // func BenchmarkGodsRBGet(b *testing.B) {
for _, v := range l { // tree := redblacktree.NewWithIntComparator()
tree.Put(v, v)
} // l := loadTestData()
} // b.N = len(l)
// for i := 0; i < b.N; i++ {
// tree.Put(l[i], i)
// }
// b.ResetTimer()
// b.StartTimer()
// execCount := 10
// b.N = len(l) * execCount
// for i := 0; i < execCount; i++ {
// for _, v := range l {
// tree.Get(v)
// }
// }
// }
// func BenchmarkGodsAvlGet(b *testing.B) {
// tree := avltree.NewWithIntComparator()
// l := loadTestData()
// b.N = len(l)
// for i := 0; i < b.N; i++ {
// tree.Put(l[i], i)
// }
// b.ResetTimer()
// b.StartTimer()
// execCount := 10
// b.N = len(l) * execCount
// for i := 0; i < execCount; i++ {
// for _, v := range l {
// tree.Get(v)
// }
// }
// }
// func BenchmarkPut(b *testing.B) {
// l := loadTestData()
// b.ResetTimer()
// b.StartTimer()
// execCount := 50
// b.N = len(l) * execCount
// for i := 0; i < execCount; i++ {
// tree := New(compare.Int)
// for _, v := range l {
// tree.Put(v, v)
// }
// }
// }
// func TestPutStable(t *testing.T) {
// }
// func BenchmarkGodsRBPut(b *testing.B) {
// l := loadTestData()
// b.ResetTimer()
// b.StartTimer()
// execCount := 50
// b.N = len(l) * execCount
// for i := 0; i < execCount; i++ {
// tree := redblacktree.NewWithIntComparator()
// for _, v := range l {
// tree.Put(v, v)
// }
// }
// }
// func BenchmarkGodsPut(b *testing.B) {
// tree := avltree.NewWithIntComparator()
// l := loadTestData()
// b.ResetTimer()
// b.StartTimer()
// b.N = len(l)
// for _, v := range l {
// tree.Put(v, v)
// }
// }