<span class="Apple-style-span" style="border-collapse: collapse; ">how about spawn process for each send_chunk?<div>           ...<span style="border-collapse: collapse; "></span></div><div><div>           TStart = now(),</div>
<div>           lists:foreach(fun(S) -> </div><div>               spawn(fun() -> send_chunk(S,</div><div class="Ih2E3d" style="color: rgb(80, 0, 80); "><div>io_lib:format("(~b usecs) Hello world!<br>", [timer:now_diff(now(),</div>
<div>TStart)])) end), </div></div><div>                Sockets),</div><div><br></div><div>(sorry to bob, clicked the wrong button :))</div></div></span><br><div class="gmail_quote">On Wed, Jan 21, 2009 at 1:38 PM, Adriano Bonat <span dir="ltr"><<a href="mailto:adrianob@gmail.com">adrianob@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Hi Bernard,<br>
<div class="Ih2E3d"><br>
On Wed, Jan 21, 2009 at 2:52 AM, Bernard Duggan <<a href="mailto:bernie@m5net.com">bernie@m5net.com</a>> wrote:<br>
<br>
> My first suggestion would be to check that you're using kernel polling<br>
> (do you start erl with "+K true"?  You should see the string<br>
> "[kernel-poll:true]" in the version line).  If not, that's probably a<br>
> significant part of it, since for every packet that comes in the VM will<br>
> be iterating over all 40k sockets to figure out which one it came from<br>
> before the message even arrives at your code.<br>
<br>
</div>Yes, I ran the tests using kernel polling.<br>
<div class="Ih2E3d"><br>
> Also, be aware that using the -- operator on a big list can be a very<br>
> expensive operation (there was a thread about it last week, in fact), so<br>
> using it to remove a single socket from a list that big could be a<br>
> significant cost.<br>
<br>
</div>That's one of the Joe's advices on his book :)<br>
But the latency for the message is not caused by that point...<br>
<div class="Ih2E3d"><br>
> Finally, I'd suggest that, if you haven't already tried it, you spawn a<br>
> separate thread (process, in erlang parlance) to handle each connection<br>
> rather than trying to deal with them all in one thread.  While I don't<br>
> think this is going to improve your performance here, it makes your code<br>
> simpler and easier to follow.  Remember, erlang processes are not like C<br>
> threads - they're cheap, plentiful and carry a much lower switching<br>
> overhead.  This would involve a little more work for your case since you<br>
> want to broadcast to everyone based on a signal from anyone, but it is<br>
> more in keeping with "The Erlang Way(tm)".  (Actual followers of The<br>
> Erlang Way are of course free to correct my views...).<br>
<br>
</div>Yes, that would go with the Erlang's way, but I wanted a way that<br>
works faster. Before I implemented my own http server, I was using<br>
mochiweb, and it uses a thread per connection and has the same<br>
performance problem as using a single thread holding several<br>
connections.<br>
<br>
Any other ideas are welcome, and thanks for you reply :)<br>
<br>
Regards.<br>
<div><div></div><div class="Wj3C7c">_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://www.erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://www.erlang.org/mailman/listinfo/erlang-questions</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Best regards<br><br>Linan Wang<br>