<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 11 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:PMingLiU;
        panose-1:2 2 3 0 0 0 0 0 0 0;}
@font-face
        {font-family:"\@PMingLiU";
        panose-1:2 2 3 0 0 0 0 0 0 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman";}
a:link, span.MsoHyperlink
        {color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:Arial;
        color:windowtext;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.25in 1.0in 1.25in;}
div.Section1
        {page:Section1;}
 /* List Definitions */
 @list l0
        {mso-list-id:928465055;
        mso-list-type:hybrid;
        mso-list-template-ids:-642091150 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
        {mso-level-tab-stop:.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1
        {mso-list-id:1710449926;
        mso-list-type:hybrid;
        mso-list-template-ids:-765833746 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l1:level1
        {mso-level-tab-stop:.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2
        {mso-list-id:1915166498;
        mso-list-type:hybrid;
        mso-list-template-ids:1578021016 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l2:level1
        {mso-level-tab-stop:.75in;
        mso-level-number-position:left;
        margin-left:.75in;
        text-indent:-.25in;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
-->
</style>

</head>

<body lang=EN-US link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>Hi all,<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>As a continue to the last discussion of cecil memory
consumption, I am attaching some changes that emphasize the concepts.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>In order to remind everyone and to introduce the problem to
the &#8216;mono-cecil&#8217; group here is a summary:<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p>&nbsp;</o:p></span></font></p>

<p class=MsoNormal style='text-indent:.5in'><font size=2 face=Arial><span
style='font-size:10.0pt;font-family:Arial'>We have noticed that cecil consume
relatively a lot of memory.<o:p></o:p></span></font></p>

<p class=MsoNormal style='text-indent:.5in'><font size=2 face=Arial><span
style='font-size:10.0pt;font-family:Arial'>This is due to the fact the code
builds a full object model on top of the assembly basic tables.<o:p></o:p></span></font></p>

<p class=MsoNormal style='margin-left:.5in'><font size=2 face=Arial><span
style='font-size:10.0pt;font-family:Arial'>Many users are only interested in
reading a part of the assembly; therefore the full object model is sometimes redundant.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p>&nbsp;</o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>At the last discussion we were considering some options:<o:p></o:p></span></font></p>

<p class=MsoNormal style='margin-left:.75in;text-indent:-.25in;mso-list:l2 level1 lfo1'><![if !supportLists]><font
size=2 face=Arial><span style='font-size:10.0pt;font-family:Arial'><span
style='mso-list:Ignore'>1.<font size=1 face="Times New Roman"><span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><![endif]><span
dir=LTR><font size=2 face=Arial><span style='font-size:10.0pt;font-family:Arial'>Get
rid of the basic tables after building the object model.<o:p></o:p></span></font></span></p>

<p class=MsoNormal style='margin-left:.75in;text-indent:-.25in;mso-list:l2 level1 lfo1'><![if !supportLists]><font
size=2 face=Arial><span style='font-size:10.0pt;font-family:Arial'><span
style='mso-list:Ignore'>2.<font size=1 face="Times New Roman"><span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><![endif]><span
dir=LTR><font size=2 face=Arial><span style='font-size:10.0pt;font-family:Arial'>Make
the object model lazy, where the objects are accessing the basic tables
directly.<o:p></o:p></span></font></span></p>

<p class=MsoNormal style='margin-left:.75in;text-indent:-.25in;mso-list:l2 level1 lfo1'><![if !supportLists]><font
size=2 face=Arial><span style='font-size:10.0pt;font-family:Arial'><span
style='mso-list:Ignore'>3.<font size=1 face="Times New Roman"><span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span></font><![endif]><span
dir=LTR><font size=2 face=Arial><span style='font-size:10.0pt;font-family:Arial'>Maybe
expose a way to load an assembly in a read-only way, which will make the
implementation easier.<o:p></o:p></span></font></span></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p>&nbsp;</o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>I have made some thinking (and coding) regarding the second option,
which I think is the right way to do it, and you can look at the attached diff
as a proposed design.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>Here are some explanations about the code changes:<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p>&nbsp;</o:p></span></font></p>

<ol style='margin-top:0in' start=1 type=1>
 <li class=MsoNormal style='mso-list:l1 level1 lfo3'><font size=2 face=Arial><span
     style='font-size:10.0pt;font-family:Arial'>A new class &#8216;LazyReflectionReader&#8217;
     is introduced, which is responsible for the lazy assembly reading. This
     class does not build all the TypeDefinition, MethodDefinition,
     FieldDefinition &#8230; objects at the beginning, but only when they are
     accessed. It also provide some internal helper methods for resolving the
     relations between elements, for example &#8216;GetDeclaringType(MetadataToken
     token)&#8217;, which is used by the lazy &#8216;object model&#8217; classes.
     Currently not all fetching is lazy, but you still can see the differences
     in terms of load time and memory consumption.<o:p></o:p></span></font></li>
 <li class=MsoNormal style='mso-list:l1 level1 lfo3'><font size=2 face=Arial><span
     style='font-size:10.0pt;font-family:Arial'>The object model instances that
     are instantiated by the &#8216;LazyReflectionReader&#8217; are not
     populated with their entire dependencies for example TypeDefinition is not
     populated with its Methods, instead they are calling the helper methods in
     the &#8216;LazyReflectionReader&#8217; in order to resolve the
     dependencies on request.<o:p></o:p></span></font></li>
 <li class=MsoNormal style='mso-list:l1 level1 lfo3'><font size=2 face=Arial><span
     style='font-size:10.0pt;font-family:Arial'>A new class &#8216;MetadataRelations&#8217;
     is introduced which is used as a preprocessor of the assembly, and creates
     the relations to be used by the helper methods.<o:p></o:p></span></font></li>
 <li class=MsoNormal style='mso-list:l1 level1 lfo3'><font size=2 face=Arial><span
     style='font-size:10.0pt;font-family:Arial'>I have added a method on
     AssemblyFactory class: &#8216;</span></font><font size=2 face="Courier New"><span
     style='font-size:10.0pt;font-family:"Courier New"'>GetAssembly (<font
     color=blue><span style='color:blue'>string</span></font> file, <font
     color=blue><span style='color:blue'>bool</span></font> lazy)&#8217;.</span></font><font
     size=2 face=Arial><span style='font-size:10.0pt;font-family:Arial'>This
     method loads an assembly in a lazy way, and I have added this method only for
     the purpose of playing with the two implementations and see the
     differences, <b><u><span style='font-weight:bold'>it is not part of the
     design</span></u></b>. <o:p></o:p></span></font></li>
</ol>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p>&nbsp;</o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>Here are some design issues that I have encountered during
my work:<o:p></o:p></span></font></p>

<p class=MsoNormal style='text-indent:.5in'><font size=2 face=Arial><span
style='font-size:10.0pt;font-family:Arial'>1. Remove the sealed modifier from
the object model classes ( TypeDefinition, FieldDefinition, MethodDefinition&#8230;
&nbsp;&nbsp;) so we can derive from them?<o:p></o:p></span></font></p>

<p class=MsoNormal style='text-indent:.5in'><font size=2 face=Arial><span
style='font-size:10.0pt;font-family:Arial'>2. Exposing a way to plugin you own
ReflectionReader, so the use can implement his own object model loading?<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p>&nbsp;</o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>This code is not tested, and is provided for design purpose.
Nevertheless you are welcome to measure the differences in loading time and
memory consumption between the lazy and not lazy load.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>Any comments, remarks are very welcome.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p>&nbsp;</o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>Regares, </span></font><o:p></o:p></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>Roei Erez</span></font><o:p></o:p></p>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'><o:p>&nbsp;</o:p></span></font></p>

</div>

</body>

</html>