Avoid constructing a delegate on every TraitDict query -- saving 250M/min

This commit is contained in:
Chris Forbes
2011-03-05 21:53:23 +13:00
parent ea022a0e06
commit 0480f1e984

View File

@@ -17,17 +17,19 @@ namespace OpenRA
{ {
class TraitDictionary class TraitDictionary
{ {
Dictionary<Type, ITraitContainer> traits = new Dictionary<Type, ITraitContainer>(); Dictionary<Type, ITraitContainer> traits = new Dictionary<Type, ITraitContainer>();
ITraitContainer InnerGet( Type t ) ITraitContainer InnerGet( Type t )
{ {
return traits.GetOrAdd( t, CreateTraitContainer ); return traits.GetOrAdd( t, doCreateTraitContainer );
} }
// construct this delegate once.
static Func<Type, ITraitContainer> doCreateTraitContainer = CreateTraitContainer;
static ITraitContainer CreateTraitContainer( Type t ) static ITraitContainer CreateTraitContainer( Type t )
{ {
return (ITraitContainer)typeof( TraitContainer<> ).MakeGenericType( t ) return (ITraitContainer)typeof( TraitContainer<> ).MakeGenericType( t )
.GetConstructor( new Type[ 0 ] ).Invoke( new object[ 0 ] ); .GetConstructor( Type.EmptyTypes ).Invoke( null );
} }
public void AddTrait( Actor actor, object val ) public void AddTrait( Actor actor, object val )