// Because the internals of maps are not visible to us, we must
// use reflection rather than pointer magic.
func (dec *Decoder) decodeMap(mtyp reflect.Type, state *decoderState, value reflect.Value, keyOp, elemOp decOp, ovfl error) {
+ n := int(state.decodeUint())
if value.IsNil() {
- // Allocate map.
- value.Set(reflect.MakeMap(mtyp))
+ value.Set(reflect.MakeMapWithSize(mtyp, n))
}
- n := int(state.decodeUint())
keyIsPtr := mtyp.Key().Kind() == reflect.Ptr
elemIsPtr := mtyp.Elem().Kind() == reflect.Ptr
keyInstr := &decInstr{keyOp, 0, nil, ovfl}
}
func BenchmarkDecodeMap(b *testing.B) {
- count := 10000
+ count := 1000
m := make(map[int]int, count)
for i := 0; i < count; i++ {
m[i] = i
bbuf := benchmarkBuf{data: buf.Bytes()}
b.ResetTimer()
for i := 0; i < b.N; i++ {
- rm := make(map[int]int, 0)
+ var rm map[int]int
bbuf.reset()
dec := NewDecoder(&bbuf)
err := dec.Decode(&rm)