If the chunks are big enough you will benefit from sending them as binary since there won't be any copying. As others have already said, you probably will benefit most from either an iolist or all binary scheme.<div><br>
</div><div>Benchmarking adding characters at a time isn't really equivalent to adding chunks at a time, especially for large chunk sizes. Of course, adding a chunk (or even a list if chunks) to either side of an iolist is O(1), so if you're mostly just building these things you're really better off leaving it like that as long as possible. <span></span><br>
<br>On Friday, July 13, 2012, CGS  wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>Yes, you are right. When I did the test, I thought also about that, so, I made a third loop which should have appended the char to the binary string. Unfortunately, I had a typo there and I ended up having the same loop for binaries (and therefore the same numbers). Your message made me check it again and I found that typo. I didn't find quite those ratios you got, but, yes, they are comparable with your ratios. Thanks a lot.</div>

<div><br></div><div><br></div><div><br><div>On Fri, Jul 13, 2012 at 4:51 PM, Anders Nygren <span dir="ltr"><<a>anders.nygren@gmail.com</a>></span> wrote:<br>
<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">For some cases appending to a binary is much faster, see<br>
<a href="http://www.erlang.org/doc/efficiency_guide/binaryhandling.html#id65923" target="_blank">http://www.erlang.org/doc/efficiency_guide/binaryhandling.html#id65923</a><br>
<br>
So Your simple benchmark is not fair, You are comparing the best case<br>
for lists with the worst case for binaries. If You change it to<br>
appending instead of prepending You will get very different results.<br>
So as one of the first replies said "it depends".<br>
<br>
On my machine:<br>
For small N prepending to a list is ~2x faster than appending to a binary.<br>
When N=1E6 appending to a binary is ~2x faster than prepending to a list.<br>
<span><font color="#888888"><br>
/Anders<br>
</font></span><div><div><br>
<br>
On Fri, Jul 13, 2012 at 6:48 AM, CGS <<a>cgsmcmlxxv@gmail.com</a>> wrote:<br>
> Hi Bob,<br>
><br>
> On Fri, Jul 13, 2012 at 2:32 AM, Bob Ippolito <<a>bob@redivi.com</a>> wrote:<br>
>><br>
>> Sorry, but that's not enough information.<br>
><br>
><br>
> Sorry, but I didn't know what you meant by that. Here are the answers.<br>
><br>
>><br>
>><br>
>> Where do these chunks come from: source code, some other process, ets?<br>
><br>
><br>
> Mostly from other processes.<br>
><br>
>><br>
>> How many chunks are in a string?<br>
><br>
><br>
> That is computed from the string size and chunk size (to be decided later).<br>
><br>
>><br>
>> Do you compose strings out of other strings, or just these chunks?<br>
><br>
><br>
> Just chunks inserted into existing/new strings.<br>
><br>
>><br>
>> Are you constructing them from tail to head like you would a list?<br>
><br>
><br>
> Unfortunately, not all the time.<br>
><br>
>><br>
>> Is the string constructed all at once, or over some time?<br>
><br>
><br>
> If you mean by that the string will be fully given in the same message or<br>
> whatever by other processes, the answer is no. Over some time may be the<br>
> answer, but with the remark that I have no idea what means "over some time"<br>
> as period of time (can get chunks one after the other for the same string or<br>
> for different strings).<br>
><br>
>><br>
>><br>
>> It sounds like you have some code that's doing something with these<br>
>> strings, because you say that it's faster to use lists than binaries. Maybe<br>
>> if you post whatever it is you used to determine that, someone can help you<br>
>> find a better algorithm and/or data structure for that benchmark.<br>
><br>
><br>
> That is simple. For benchmark I just took two simple loops (only for<br>
> insertion):<br>
><br>
> -export([loop_list/1, loop_binary/2]).<br>
><br>
> loop_list(0) -> [];<br>
> loop_list(N) -> [107 | loop_list(N)].<br>
><br>
> loop_binary(0,B) -> B;<br>
> loop_binary(N,B) -> loop_binary(N-1,<<107,B/binary>>).<br>
><br>
> If you go in powers of tens and measure the execution time, you will see the<br>
> difference (you will also notice the drop in efficiency for binaries when<br>
> you need fragmentation for the same string, which is not visible in the case<br>
> of lists - or at least I couldn't notice). That is not a fully conclusive<br>
> test for my case, but it is quite a conclusive test for processing speed in<br>
> the two cases (simple expansion of the string by adding a char at the<br>
> beginning of the string), in which, for a 10^5 chars string, the list gains<br>
> at least one order of magnitude in processing time than its binary<br>
> counterpart (1) (2) (3).<br>
><br>
> (1) Even if you change the list loop to have an accumulator in which the<br>
> list exists, there is still one order of magnitude difference.<br>
> (2) The results are specific for the machine on which the tests are done.<br>
> (3) That is just an example.<br>
><br>
> CGS<br>
><br>
><br>
>><br>
>><br>
>><br>
>> On Thursday, July 12, 2012, CGS wrote:<br>
>>><br>
>>> Unfortunately, the project is still in the planning stage, so, no real<br>
>>> code was written yet. Nevertheless, I plan some open source projects for<br>
>>> some parts of the project.<br>
>>><br>
>>> About each string, it is constructed from chunks of fixe</div></div></blockquote></div></div></blockquote></div>