benchmark 转移到其他仓库
This commit is contained in:
@@ -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:
|
|
||||||
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)
|
|
||||||
gods.Push(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
r1 := spew.Sprint(h.Values())
|
|
||||||
r2 := spew.Sprint(gods.Values())
|
|
||||||
if r1 != r2 {
|
|
||||||
t.Error(r1)
|
|
||||||
t.Error(r2)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestPop(t *testing.T) {
|
|
||||||
|
|
||||||
for i := 0; i < 200000; i++ {
|
|
||||||
h := New(Int)
|
|
||||||
|
|
||||||
// m := make(map[int]int)
|
|
||||||
gods := binaryheap.NewWithIntComparator()
|
|
||||||
for c := 0; c < 40; c++ {
|
|
||||||
v := randomdata.Number(0, 100)
|
|
||||||
// if _, ok := m[v]; !ok {
|
|
||||||
h.Push(v)
|
|
||||||
gods.Push(v)
|
|
||||||
// m[v] = v
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// t.Error(h.Values())
|
|
||||||
// t.Error(gods.Values())
|
|
||||||
for c := 0; c < randomdata.Number(5, 10); c++ {
|
|
||||||
v1, _ := h.Pop()
|
|
||||||
v2, _ := gods.Pop()
|
|
||||||
|
|
||||||
if v1 != v2 {
|
|
||||||
t.Error(h.Values(), v1)
|
|
||||||
t.Error(gods.Values(), v2)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
r1 := spew.Sprint(h.Values())
|
|
||||||
r2 := spew.Sprint(gods.Values())
|
|
||||||
if r1 != r2 {
|
|
||||||
t.Error(r1)
|
|
||||||
t.Error(r2)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkPush(b *testing.B) {
|
|
||||||
|
|
||||||
l := loadTestData()
|
|
||||||
|
|
||||||
b.ResetTimer()
|
|
||||||
execCount := 50
|
|
||||||
b.N = len(l) * execCount
|
|
||||||
|
|
||||||
for c := 0; c < execCount; c++ {
|
|
||||||
b.StopTimer()
|
|
||||||
h := New(Int)
|
|
||||||
b.StartTimer()
|
|
||||||
for _, v := range l {
|
for _, v := range l {
|
||||||
h.Push(v)
|
h.Push(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, tv := range ol {
|
||||||
|
if v, isfound := h.Top(); isfound {
|
||||||
|
if !(isfound && v == tv) {
|
||||||
|
t.Error(v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, isfound := h.Pop(); isfound {
|
||||||
|
if !(isfound && v == tv) {
|
||||||
|
t.Error(v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if h.Size() != 0 {
|
||||||
|
t.Error("heap size is not equals to zero")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkPop(b *testing.B) {
|
// func Int(k1, k2 interface{}) int {
|
||||||
|
// c1 := k1.(int)
|
||||||
|
// c2 := k2.(int)
|
||||||
|
// switch {
|
||||||
|
// case c1 > c2:
|
||||||
|
// return -1
|
||||||
|
// case c1 < c2:
|
||||||
|
// return 1
|
||||||
|
// default:
|
||||||
|
// return 0
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
h := New(Int)
|
// func TestPush(t *testing.T) {
|
||||||
|
|
||||||
l := loadTestData()
|
// for i := 0; i < 1000000; i++ {
|
||||||
|
// h := New(Int)
|
||||||
|
|
||||||
b.ResetTimer()
|
// gods := binaryheap.NewWithIntComparator()
|
||||||
execCount := 20
|
// for c := 0; c < 20; c++ {
|
||||||
b.N = len(l) * execCount
|
// v := randomdata.Number(0, 100)
|
||||||
|
// h.Push(v)
|
||||||
|
// gods.Push(v)
|
||||||
|
// }
|
||||||
|
|
||||||
for c := 0; c < execCount; c++ {
|
// r1 := spew.Sprint(h.Values())
|
||||||
b.StopTimer()
|
// r2 := spew.Sprint(gods.Values())
|
||||||
for _, v := range l {
|
// if r1 != r2 {
|
||||||
h.Push(v)
|
// t.Error(r1)
|
||||||
}
|
// t.Error(r2)
|
||||||
b.StartTimer()
|
// break
|
||||||
for h.size != 0 {
|
// }
|
||||||
h.Pop()
|
// }
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkGodsPop(b *testing.B) {
|
// }
|
||||||
|
|
||||||
h := binaryheap.NewWithIntComparator()
|
// func TestPop(t *testing.T) {
|
||||||
|
|
||||||
l := loadTestData()
|
// for i := 0; i < 200000; i++ {
|
||||||
|
// h := New(Int)
|
||||||
|
|
||||||
b.ResetTimer()
|
// // m := make(map[int]int)
|
||||||
execCount := 20
|
// gods := binaryheap.NewWithIntComparator()
|
||||||
b.N = len(l) * execCount
|
// for c := 0; c < 40; c++ {
|
||||||
|
// v := randomdata.Number(0, 100)
|
||||||
|
// // if _, ok := m[v]; !ok {
|
||||||
|
// h.Push(v)
|
||||||
|
// gods.Push(v)
|
||||||
|
// // m[v] = v
|
||||||
|
// // }
|
||||||
|
|
||||||
for c := 0; c < execCount; c++ {
|
// }
|
||||||
b.StopTimer()
|
|
||||||
for _, v := range l {
|
|
||||||
h.Push(v)
|
|
||||||
}
|
|
||||||
b.StartTimer()
|
|
||||||
for h.Size() != 0 {
|
|
||||||
h.Pop()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
// // t.Error(h.Values())
|
||||||
|
// // t.Error(gods.Values())
|
||||||
|
// for c := 0; c < randomdata.Number(5, 10); c++ {
|
||||||
|
// v1, _ := h.Pop()
|
||||||
|
// v2, _ := gods.Pop()
|
||||||
|
|
||||||
func BenchmarkGodsPush(b *testing.B) {
|
// if v1 != v2 {
|
||||||
l := loadTestData()
|
// t.Error(h.Values(), v1)
|
||||||
|
// t.Error(gods.Values(), v2)
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
b.ResetTimer()
|
// r1 := spew.Sprint(h.Values())
|
||||||
execCount := 50
|
// 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()
|
|
||||||
h := binaryheap.NewWith(Int)
|
|
||||||
b.StartTimer()
|
|
||||||
for _, v := range l {
|
|
||||||
h.Push(v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func loadTestData() []int {
|
// l := loadTestData()
|
||||||
data, err := ioutil.ReadFile("../l.log")
|
|
||||||
if err != nil {
|
// b.ResetTimer()
|
||||||
log.Println(err)
|
// execCount := 50
|
||||||
}
|
// b.N = len(l) * execCount
|
||||||
var l []int
|
|
||||||
decoder := gob.NewDecoder(bytes.NewReader(data))
|
// for c := 0; c < execCount; c++ {
|
||||||
decoder.Decode(&l)
|
// b.StopTimer()
|
||||||
return l
|
// h := New(Int)
|
||||||
}
|
// b.StartTimer()
|
||||||
|
// for _, v := range l {
|
||||||
|
// h.Push(v)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func BenchmarkPop(b *testing.B) {
|
||||||
|
|
||||||
|
// h := New(Int)
|
||||||
|
|
||||||
|
// l := loadTestData()
|
||||||
|
|
||||||
|
// b.ResetTimer()
|
||||||
|
// execCount := 20
|
||||||
|
// b.N = len(l) * execCount
|
||||||
|
|
||||||
|
// for c := 0; c < execCount; c++ {
|
||||||
|
// b.StopTimer()
|
||||||
|
// for _, v := range l {
|
||||||
|
// h.Push(v)
|
||||||
|
// }
|
||||||
|
// b.StartTimer()
|
||||||
|
// for h.size != 0 {
|
||||||
|
// h.Pop()
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func BenchmarkGodsPop(b *testing.B) {
|
||||||
|
|
||||||
|
// h := binaryheap.NewWithIntComparator()
|
||||||
|
|
||||||
|
// l := loadTestData()
|
||||||
|
|
||||||
|
// b.ResetTimer()
|
||||||
|
// execCount := 20
|
||||||
|
// b.N = len(l) * execCount
|
||||||
|
|
||||||
|
// 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
|
||||||
|
// }
|
||||||
|
|||||||
@@ -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")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, tv := range l[0 : len(l)-1] {
|
||||||
|
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) {
|
// func BenchmarkGet(b *testing.B) {
|
||||||
s := New()
|
// s := New()
|
||||||
b.N = 20000000
|
// b.N = 20000000
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
v := randomdata.Number(0, 65535)
|
|
||||||
s.Push(v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkGodsPush(b *testing.B) {
|
// for i := 0; i < b.N; i++ {
|
||||||
s := arraystack.New()
|
// v := randomdata.Number(0, 65535)
|
||||||
b.N = 2000000
|
// s.Push(v)
|
||||||
for i := 0; i < b.N; i++ {
|
// }
|
||||||
v := randomdata.Number(0, 65535)
|
|
||||||
s.Push(v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkPop(b *testing.B) {
|
// b.ResetTimer()
|
||||||
s := New()
|
// b.StartTimer()
|
||||||
b.N = 2000000
|
|
||||||
|
|
||||||
for i := 0; i < b.N; i++ {
|
// for i := 0; i < b.N; i++ {
|
||||||
v := randomdata.Number(0, 65535)
|
// s.Get(i)
|
||||||
s.Push(v)
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
b.ResetTimer()
|
// func BenchmarkPush(b *testing.B) {
|
||||||
b.StartTimer()
|
// s := New()
|
||||||
|
// b.N = 20000000
|
||||||
|
// for i := 0; i < b.N; i++ {
|
||||||
|
// v := randomdata.Number(0, 65535)
|
||||||
|
// s.Push(v)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
for i := 0; i < b.N; i++ {
|
// func BenchmarkGodsPush(b *testing.B) {
|
||||||
s.Pop()
|
// s := arraystack.New()
|
||||||
}
|
// b.N = 2000000
|
||||||
}
|
// for i := 0; i < b.N; i++ {
|
||||||
|
// v := randomdata.Number(0, 65535)
|
||||||
|
// s.Push(v)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
func BenchmarkGodsPop(b *testing.B) {
|
// func BenchmarkPop(b *testing.B) {
|
||||||
s := arraystack.New()
|
// s := New()
|
||||||
b.N = 2000000
|
// b.N = 2000000
|
||||||
|
|
||||||
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.Pop()
|
// s.Pop()
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
func BenchmarkValues(b *testing.B) {
|
// func BenchmarkGodsPop(b *testing.B) {
|
||||||
s := New()
|
// s := arraystack.New()
|
||||||
for i := 0; i < b.N; i++ {
|
// b.N = 2000000
|
||||||
v := randomdata.Number(0, 65535)
|
|
||||||
s.Push(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
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.Values()
|
// b.StartTimer()
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkGodsValues(b *testing.B) {
|
// for i := 0; i < b.N; i++ {
|
||||||
s := arraystack.New()
|
// s.Pop()
|
||||||
for i := 0; i < b.N; i++ {
|
// }
|
||||||
v := randomdata.Number(0, 65535)
|
// }
|
||||||
s.Push(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
b.ResetTimer()
|
// func BenchmarkValues(b *testing.B) {
|
||||||
b.StartTimer()
|
// s := New()
|
||||||
|
// for i := 0; i < b.N; i++ {
|
||||||
|
// v := randomdata.Number(0, 65535)
|
||||||
|
// s.Push(v)
|
||||||
|
// }
|
||||||
|
|
||||||
for i := 0; i < b.N; i++ {
|
// b.ResetTimer()
|
||||||
s.Values()
|
// 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()
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|||||||
@@ -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++ {
|
// // for i := 0; i < len(l); i++ {
|
||||||
// v := l[i]
|
// // v := l[i]
|
||||||
// hm.Put(v, v)
|
// // hm.Put(v, v)
|
||||||
// }
|
// // }
|
||||||
|
|
||||||
b.StartTimer()
|
// b.StartTimer()
|
||||||
|
|
||||||
for c := 0; c < executeCount; c++ {
|
// 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.Log(len(hm.table), hm.size)
|
// //b.Log(len(hm.table), hm.size)
|
||||||
//PrintMemUsage()
|
// //PrintMemUsage()
|
||||||
}
|
// }
|
||||||
|
|
||||||
func BenchmarkGoPut(b *testing.B) {
|
// func BenchmarkGoPut(b *testing.B) {
|
||||||
|
|
||||||
l := loadTestData()
|
// l := loadTestData()
|
||||||
|
|
||||||
hm := make(map[int]int)
|
// hm := make(map[int]int)
|
||||||
b.N = len(l) * executeCount
|
// b.N = len(l) * executeCount
|
||||||
for c := 0; c < executeCount; c++ {
|
// 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[v] = v
|
// hm[v] = v
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
//b.Log(len(m))
|
// //b.Log(len(m))
|
||||||
//PrintMemUsage()
|
// //PrintMemUsage()
|
||||||
}
|
// }
|
||||||
|
|
||||||
// func BenchmarkGet(b *testing.B) {
|
// func BenchmarkGet(b *testing.B) {
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
// }
|
||||||
|
|
||||||
}
|
// }
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|||||||
@@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|||||||
@@ -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++ {
|
// 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 := 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, 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 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, 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 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 {
|
||||||
sl.Get(v)
|
// sl.Get(v)
|
||||||
// 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 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, 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 := 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], 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 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, v)
|
// tree.Put(v, v)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
func TestPutStable(t *testing.T) {
|
// func TestPutStable(t *testing.T) {
|
||||||
|
|
||||||
}
|
// }
|
||||||
|
|
||||||
func BenchmarkGodsRBPut(b *testing.B) {
|
// func BenchmarkGodsRBPut(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 := redblacktree.NewWithIntComparator()
|
// tree := redblacktree.NewWithIntComparator()
|
||||||
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)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|||||||
Reference in New Issue
Block a user