Cecil might need more memory while loading an assembly, but the Cecil objects can be garbage collected as soon as the load operation is complete. (though it takes a full gen2 GC to get rid of the arrays in the LOH) The 14 MB is the difference between 'before' and 'after':
List<IProjectContent> pcs = new List<IProjectContent>();
long before = GC.GetTotalMemory(true);
foreach (string asm in assemblies) {
CecilLoader loader = new CecilLoader();
loader.DocumentationProvider
= new XmlDocumentationProvider(path + System.IO.Path.ChangeExtension(asm,
".xml"));
pcs.Add(loader.LoadAssemblyFile(path + asm));
}
long after = GC.GetTotalMemory(true);
On the XmlDocumentationProvider: the 14 MB include an index into the
.xml file so that documentation for a single member can be found without
having to read in the whole file.
Daniel
On 9/14/2011 12:25, Greg Young wrote:
> hmm this would be a possibility to look at. but would require us to
> rewrite all of our code to no longer use cecil objects directly. This
> is the longer term plan. We would prefer something a bit less involved
> (lower risk) at this time.
>
> One question, I assume when you use 14 mb of memory that is only for
> your model (not including the memory cecil uses when loading up of
> this model as it will be more from what we have seen, it loads up
> bunches of byte arrays to hold assembly data in the large object
> heap).
>
> On Wed, Sep 14, 2011 at 5:07 AM, Daniel Grunwald
> <[email protected]> wrote:
>> Which metadata do you need exactly?
>>
>> ICSharpCode.NRefactory.TypeSystem provides a view on the types and
>> members in an assembly, and can be initialized using CecilLoader.
>> When loading the public types/members (using
>> CecilLoader.IncludeInternalMembers=false, which is the default) from the
>> following assemblies (the default references is a new WPF project):
>> - mscorlib
>> - System
>> - System.Core
>> - System.Data
>> - System.Data.DataSetExtensions
>> - System.Xml
>> - System.Xml.Linq
>> - PresentationCore
>> - PresentationFramework
>> - WindowsBase
>> - System.Xaml
>>
>> NRefactory 5 takes only 14 MB of memory with all of these loaded (and
>> when also including internal/private members: 32 MB), and I have some
>> ideas on how to reduce this even further.
>> You can also speed up the load time by serializing the type system -
>> loading this set of assemblies and copying the info from Cecil to
>> NR.TypeSystem takes 2 seconds, but deserializing a cached copy of the
>> type system using NR's FastSerializer takes only 0.25 seconds.
>>
>> The downside is that you don't get all the information from an assembly
>> - e.g. it's missing the method bodies. But pretty much everything else
>> is present - types, methods, fields, properties, events, parameters,
>> custom and non-custom attributes, security declarations, constant
>> values, etc.
>>
>> You can find NRefactory on https://github.com/icsharpcode/NRefactory/
>>
>> Daniel
>>
>> On 9/14/2011 01:40, Greg Young wrote:
>>> To be clear, I can patch to not use the LOH pretty quickly and easily
>>> its the everything gets held in memory part thats a bit of an issue we
>>> really only need the metadata and it seems that getting the metadata
>>> copied over will be a pretty involved task.
>>>
>>> On Tue, Sep 13, 2011 at 7:37 PM, Greg Young <[email protected]> wrote:
>>>> I know I have put up some discussion about this in the past but is
>>>> there anyway (possibly something new) to lower cecil's memory usage?
>>>>
>>>> I have looked at copying over cecil objects and it would be a pretty
>>>> major task. The alternative is to make cecil objects as short lived as
>>>> possible. Basically what we want is to only hold all of the metadata
>>>> that is provided and none of the code. We have already taken the easy
>>>> mechanism of setting MethodBodys to a new MethodBody after reading
>>>> them but the module still holds the whole assembly in the LOH.
>>>>
>>>> Greg
>>>>
>>>> --
>>>> Le doute n'est pas une condition agréable, mais la certitude est absurde.
>>>>
>>>> --
>>>> --
>>>> mono-cecil
>>>
>>
>>
>
>
signature.asc
Description: OpenPGP digital signature
