tree stats
parent
223c046887
commit
a3fa9b2387
76
pmap.go
76
pmap.go
|
@ -209,3 +209,79 @@ func insert(n interface{}, shift, hash uint32, key Key, val Value, hashFn hashFu
|
|||
newNode = _insert(n, shift)
|
||||
return
|
||||
}
|
||||
|
||||
type stats struct {
|
||||
count int
|
||||
maxHeight int
|
||||
avgHeight float64
|
||||
avgDegree float64
|
||||
nodeCount int
|
||||
leafCount int
|
||||
collisionCount int
|
||||
collidedKeys int
|
||||
emptySlots int
|
||||
}
|
||||
|
||||
func (p pmap) stats() stats {
|
||||
var s stats
|
||||
var th float64
|
||||
var td float64
|
||||
var visit func(n interface{}, h int)
|
||||
visit = func(n interface{}, h int) {
|
||||
switch n := n.(type) {
|
||||
case leaf:
|
||||
s.count++
|
||||
s.leafCount++
|
||||
th += float64(h)
|
||||
if s.maxHeight < h {
|
||||
s.maxHeight = h
|
||||
}
|
||||
case *node:
|
||||
s.count++
|
||||
s.nodeCount++
|
||||
s.emptySlots += bits.OnesCount32(^n.bitmap)
|
||||
td += float64(bits.OnesCount32(n.bitmap))
|
||||
for i := range n.child {
|
||||
if n.child[i] != nil {
|
||||
visit(n.child[i], h+1)
|
||||
}
|
||||
}
|
||||
case *collision:
|
||||
s.collisionCount++
|
||||
s.collidedKeys += len(n.leaf)
|
||||
default:
|
||||
panic("pmap: unhandled case in stats")
|
||||
}
|
||||
}
|
||||
visit(p.root, 1)
|
||||
if s.leafCount > 0 {
|
||||
s.avgHeight = th / float64(s.leafCount)
|
||||
}
|
||||
if s.nodeCount > 0 {
|
||||
s.avgDegree = td / float64(s.nodeCount)
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
func (s stats) String() string {
|
||||
return fmt.Sprintf(
|
||||
"count = %d\n"+
|
||||
"maxHeight = %d\n"+
|
||||
"avgHeight = %g\n"+
|
||||
"avgDegree = %g\n"+
|
||||
"nodeCount = %d\n"+
|
||||
"leafCount = %d\n"+
|
||||
"collisionCount = %d\n"+
|
||||
"collidedKeys = %d\n"+
|
||||
"emptySlots = %d\n",
|
||||
s.count,
|
||||
s.maxHeight,
|
||||
s.avgHeight,
|
||||
s.avgDegree,
|
||||
s.nodeCount,
|
||||
s.leafCount,
|
||||
s.collisionCount,
|
||||
s.collidedKeys,
|
||||
s.emptySlots,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
package pmap
|
||||
|
||||
import "testing"
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestPmap(t *testing.T) {
|
||||
p := New()
|
||||
|
@ -17,6 +20,7 @@ func TestPmap(t *testing.T) {
|
|||
t.Errorf("Get(%d) = %v %v, want %v %v", i, v, ok, i, true)
|
||||
}
|
||||
}
|
||||
fmt.Print(p.(pmap).stats())
|
||||
}
|
||||
|
||||
func BenchmarkGet(b *testing.B) {
|
||||
|
|
Loading…
Reference in New Issue