From: Rob Pike Date: Mon, 10 Nov 2008 22:53:40 +0000 (-0800) Subject: Add a cache to avoid unnecessary parsing of type strings when constructing values X-Git-Tag: weekly.2009-11-06~2756 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=842e1a9aa70648a013d5a48073683f08332e461d;p=gostls13.git Add a cache to avoid unnecessary parsing of type strings when constructing values R=rsc DELTA=12 (9 added, 0 deleted, 3 changed) OCL=18916 CL=18921 --- diff --git a/src/lib/reflect/value.go b/src/lib/reflect/value.go index c7089b1580..fe41e3f926 100644 --- a/src/lib/reflect/value.go +++ b/src/lib/reflect/value.go @@ -695,6 +695,7 @@ func FuncCreator(typ Type, addr Addr) Value { } var creator *map[int] Creator +var typecache *map[string] *Type func init() { creator = new(map[int] Creator); @@ -722,6 +723,8 @@ func init() { creator[StructKind] = &StructCreator; creator[InterfaceKind] = &InterfaceCreator; creator[FuncKind] = &FuncCreator; + + typecache = new(map[string] *Type); } func NewValueAddr(typ Type, addr Addr) Value { @@ -752,10 +755,16 @@ export func NewInitValue(typ Type) Value { export func NewValue(e Empty) Value { value, typestring := sys.reflect(e); - typ := ParseTypeString("", typestring); + p, ok := typecache[typestring]; + if !ok { + typ := ParseTypeString("", typestring); + p = new(Type); + *p = typ; + typecache[typestring] = p; + } // Content of interface is a value; need a permanent copy to take its address // so we can modify the contents. Values contain pointers to 'values'. ap := new(uint64); *ap = value; - return NewValueAddr(typ, PtrUint64ToAddr(ap)); + return NewValueAddr(*p, PtrUint64ToAddr(ap)); }