This is an automated email letting you know that sources 
have recently been pushed out.  You can download these newer 
sources directly from 
http://ironpython.codeplex.com/SourceControl/changeset/view/64949.

ADDED SOURCES
        
$/IronPython/IronPython_Main/Src/IronPython/Runtime/ConstantDictionaryStorage.cs
        
$/IronPython/IronPython_Main/Src/IronPython/Runtime/EmptyDictionaryStorage.cs

MODIFIED SOURCES
        
$/IronPython/IronPython_Main/Src/IronPython/Runtime/ConstantDictionaryStorage.cs
        $/IronPython/IronPython_Main/Src/IronPython/Compiler/Ast/AstMethods.cs
        
$/IronPython/IronPython_Main/Src/IronPython/Runtime/AttributesDictionaryStorage.cs
        
$/IronPython/IronPython_Main/Src/IronPython/Runtime/CustomDictionaryStorage.cs
        
$/IronPython/IronPython_Main/Src/IronPython/Runtime/BuiltinsDictionaryStorage.cs
        
$/IronPython/IronPython_Main/Src/IronPython/Runtime/CommonDictionaryStorage.cs
        $/IronPython/IronPython_Main/Src/IronPython/Runtime/DictionaryOps.cs
        $/IronPython/IronPython_Main/Src/IronPython.Modules/thread.cs
        
$/IronPython/IronPython_Main/Src/IronPython/Compiler/Ast/TupleExpression.cs
        $/IronPython/IronPython_Main/Src/IronPython/Compiler/Ast/Expression.cs
        
$/IronPython/IronPython_Main/Src/IronPython/Compiler/Ast/DictionaryExpression.cs
        
$/IronPython/IronPython_Main/Src/IronPython/Compiler/Ast/ConstantExpression.cs
        $/IronPython/IronPython_Main/Src/IronPython/IronPython.csproj
        
$/IronPython/IronPython_Main/Src/IronPython/Runtime/EmptyDictionaryStorage.cs
        
$/IronPython/IronPython_Main/Src/IronPython/Runtime/StringDictionaryStorage.cs
        
$/IronPython/IronPython_Main/Src/IronPython/Runtime/ModuleDictionaryStorage.cs
        $/IronPython/IronPython_Main/Src/IronPython/Runtime/PythonDictionary.cs
        
$/IronPython/IronPython_Main/Src/IronPython/Runtime/ScopeDictionaryStorage.cs
        $/IronPython/IronPython_Main/Src/IronPython/Runtime/DictionaryStorage.cs
        
$/IronPython/IronPython_Main/Src/IronPython/Runtime/Operations/PythonOps.cs
        
$/IronPython/IronPython_Main/Src/IronPython/Runtime/ObjectAttributesAdapter.cs
        
$/IronPython/IronPython_Main/Src/IronPython/Runtime/Types/CustomInstanceDictionaryStorage.cs
        $/IronPython/IronPython_Main/Src/IronPython/Runtime/Types/OldClass.cs
        $/IronPython/IronPython_Main/Src/IronPython/Runtime/WrapperDictionary.cs
        $/IronPython/IronPython_Main/Src/IronPythonTest/EngineTest.cs
        
$/IronPython/IronPython_Main/Src/IronPythonTest/StringDictionaryStorage.cs
        $/IronPython/IronPython_Main/Tutorial/Tutorial.htm

CHECKIN COMMENTS
--------------------------------------------------------------------------------
Changeset Id: 1695947
Date: 3/23/2010 10:57:21 AM

Optimize dictionaries for size which also slightly improves throughput.  
Switches to using open addressing instead of chaining buckets.  We now store an 
array of Bucket[] structs.   Also moves the storage for the null key into its 
own object rather than storing it with the rest of the values.  Because Bucket 
is now a struct we can no longer have a special DeserializationBucket – instead 
we now have a special DeserializationNullValue.  The net result is that each 
bucket is now half the size (3 fields vs. 4 fields + vtable + sync header).  
But we also now need to keep the table below a load factor of .7.  But the end 
result is a net win on size overall and better cache locality.

Also optimizes the storage of empty dictionaries – we change the API on 
DictionaryStorage so that it passes in the address of where the storage lives.  
If the current storage wants to change its type it can update the reference 
passed in so that we switch storages.  This is currently done with the empty 
dictionary storage and the constant dictionary storage.  When we create a new 
empty dictionary it shares a common instance of EmptyDictionaryStorage.  Any 
attempts to mutate it result in the creation of a new CommonDictionaryStorage 
which contains the new values.  Likewise there’s also a 
ConstantDictionaryStorage which does a similar thing.  

Long term this can be used for other optimizations – for example we can 
implement StringDictionaryStorage and IntDictionaryStorage this way so that we 
don’t need to do a delegate invocation to hash the keys, instead it can all be 
in-lined.  It also might open up the possibility to storing value types in a 
non-boxed fashion down the line but I think there are more issues which need to 
be dealt with for that to perform well.

Also added some tests to make sure we get the thread safety right of switching 
between EmptyDictionaryStorage and ConstantDictionaryStorage.



(Shelveset: dinov1_0;REDMOND\dinov | SNAP CheckinId: 10570)

_______________________________________________
Users mailing list
[email protected]
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

Reply via email to