<br><br><div class="gmail_quote">2013/2/8  <span dir="ltr"><<a href="mailto:ok@cs.otago.ac.nz" target="_blank">ok@cs.otago.ac.nz</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">> An idea which seems like it should be included in this EEP, is simply a<br>
> function to determine how much real memory is consumed by an erlang<br>
> variable.<br>
<br>
</div>Given a language with immutable data structures and free sharing,<br>
I am having a hard time trying to think what this might mean.<br>
Consider as one of the *easy* cases<br>
<br>
    L0 = [],<br>
    L1 = [L0|L0],<br>
    ...<br>
    L99 = [L98|L98]<br>
<br>
The amount of memory it really uses is just 99 cons cells,<br>
presumably 198 words.  The amount that will be calculated<br>
by a recursive sizer is about 2^99 (approximately).<br></blockquote><div><br></div><div>Btw, If its just the matter of memory then there exists erts_debug:size/1 and erts_debug:flat_size/1 (calculates number of words):</div>
<div><br></div><div><div><font face="courier new, monospace">Eshell V5.9  (abort with ^G)</font></div><div><font face="courier new, monospace">1> A = {1,2,3}.</font></div><div><font face="courier new, monospace">{1,2,3}</font></div>
<div><font face="courier new, monospace">2> B = [A|A].</font></div><div><font face="courier new, monospace">[{1,2,3}|{1,2,3}]</font></div><div><font face="courier new, monospace">3> erts_debug:size(B).</font></div><div>
<font face="courier new, monospace">6</font></div><div><font face="courier new, monospace">4> erts_debug:flat_size(B).</font></div><div><font face="courier new, monospace">10</font></div></div><div><br></div><div> </div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
There are at least the following notions:<br>
 - size in external representation<br>
 - amount copied when sent to a local PID<br>
 - amount found by a recursive walker<br>
 - amount used taking internal cycles into account<br>
 - fair share considering all references in the current PID<br>
 - fair share including references to binaries from other PIDs.<br>
<br>
It seems to me that there is one thing that _could_ be done<br>
but would be a fair bit of work, and that's allocation<br>
profiling.  Arrange to generate different BEAM code which<br>
records each (amount of memory, source location where<br>
allocation happens) so that you can run a test case and see<br>
which expressions are responsible for allocating how much<br>
memory.<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</div></div></blockquote></div><br>