Hi,<div><br></div><div>About the two lists you were speaking about (I suppose you were referring to the output of lists:map/2 and lists:seq/2), the second is destroyed as soon as lists:map/2 exits. So, there shouldn't be any overhead here. And, yes, the memory consumption peaked at higher value, but stabilized itself at the value I mentioned before.</div>
<div><br></div><div>On a 64-bits machine, 2 words = 16 B and 3 words = 24 B, so, my value of 21 B is exactly in between 2 and 3 words. I suppose you worked on 32-bits machine or with half-world emulator and you got half of that value (or a bit less if we are to consider that the shell is adding bigger overhead).</div>
<div><br></div><div>CGS</div><div><br></div><div><br></div><div><br></div><div><br><div class="gmail_quote">On Sun, Jul 8, 2012 at 7:22 AM,  <span dir="ltr"><<a href="mailto:ok@cs.otago.ac.nz" target="_blank">ok@cs.otago.ac.nz</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">> Hm, ignore my previous answer, then; I was under the impression that<br>
> small enough integers would be stored as immediates in the<br>
> list cell...<br>
<br>
</div>They are.<br>
See the Efficiency guide.<br>
<a href="http://www.erlang.org/doc/efficiency_guide/advanced.html#id68680" target="_blank">http://www.erlang.org/doc/efficiency_guide/advanced.html#id68680</a><br>
"String ... 2 words per character"<br>
<br>
Each list cell holds one integer, which *is* an immediate in the<br>
list cell and points nowhere else, and one pointer to the next<br>
element in the list.<br>
<div class="im"><br>
<br>
<br>
>> 2. opening an Erlang shell (few MB consumption - stable);<br>
>> 3. executing:<br>
>><br>
>><br>
>> L = lists:map(fun(_) -> 107 end,lists:seq(1,10000000)), ok.<br>
<br>
</div>Two things strike me about this.<br>
(A) you construct TWO lists here, so at 8 bytes per list cell<br>
on a 32-bit machine, there's 16 bytes each already.<br>
(B) You are doing this in the shell, where expressions are<br>
interpreted.  I have no idea what space overheads that adds.<br>
<br>
Is there a way of measuring the amount of heap space currently<br>
_used_ in a process?  process_info>heap_size and<br>
process_info>total_heap_size seem to be about the amount of<br>
space allocated for a process, including its stack and any quantity<br>
of free space.  So the following only gave me an approximate idea:<br>
<br>
-module(ss).<br>
-export([ss/1]).<br>
<br>
heap_size() -><br>
    erlang:garbage_collect(),<br>
    element(2, process_info(self(), heap_size)).<br>
<br>
ss(N) -><br>
    Before = heap_size(),<br>
    Result = loop(N),<br>
    After  = heap_size(),<br>
    (After-Before)*1.0 / length(Result).<br>
<br>
loop(0) -><br>
    [];<br>
loop(N) -><br>
    [$k | loop(N-1)].<br>
<br>
<br>
However, the idea it _did_ give me was "between 2 and 3 words<br>
per character", so it looks like "2 words per character" as<br>
stated in the Efficiency Guide is, after all, true.<br>
<br>
It's certainly nowhere near 21 bytes.<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></div>