Erlang will be slower and will consume more memory than C.  That's pretty much par for the course due to type munging and layers between you and the hardware, including the VM itself.  Some are using libevent through an Erlang port to get around this.<div>
<br><div>You can also try "when I receive a packet, spawn an unlinked process to do the reply" which may unblock things.  (Not sure, haven't profiled it myself.)</div><div>Writing C directly to low-level structures is known to be much faster than the Erlang VM.  You can also see this in action at <a href="http://www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-3">http://www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-3</a></div>
<div><br></div><div>-mox<br><div><br></div><div><br><div class="gmail_quote">On Mon, Aug 13, 2012 at 12:11 PM, Ronny Meeus <span dir="ltr"><<a href="mailto:ronny.meeus@gmail.com" target="_blank">ronny.meeus@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello<br>
<br>
I have created a simple UDP based client/server application.<br>
The code is available on bitbucket<br>
(<a href="https://bitbucket.org/meeusr/erl-examples" target="_blank">https://bitbucket.org/meeusr/erl-examples</a>) in the networking<br>
directory.<br>
<br>
The server is just an echo server running in 1 process.<br>
The client can behave like a sync client (sending 1 message and<br>
waiting for the reply) or like an async client (sending X messages<br>
before waiting for all the replies).<br>
I see that my PC (Intel(R) Quad code i7 CPU 860  @ 2.80GHz) is able to<br>
process something like 7K - 10K messages per second. Both the sync and<br>
the async are in the same order of magnitude. Please note that I use<br>
the loopback interface.<br>
<br>
$ erl +sbt db<br>
Erlang R15B01 (erts-5.9.1) [source] [64-bit] [smp:4:4]<br>
[async-threads:0] [hipe] [kernel-poll:false]<br>
<br>
Eshell V5.9.1  (abort with ^G)<br>
1> c(gen_udp_test).<br>
gen_udp_test.erl:47: Warning: variable 'Data' is unused<br>
gen_udp_test.erl:47: Warning: variable 'Msg' is unused<br>
gen_udp_test.erl:62: Warning: variable 'Data' is unused<br>
gen_udp_test.erl:62: Warning: variable 'Msg' is unused<br>
{ok,gen_udp_test}<br>
2> gen_udp_test:start_server().<br>
true<br>
...<br>
12> gen_udp_test:client_async(5000).<br>
stop : 841482<br>
ok<br>
13> gen_udp_test:client_async(6000).<br>
stop : 1082679<br>
ok<br>
<br>
The timings are the number of usec for the processing of the X number<br>
of messages (round-trip).<br>
<br>
If I implement the same application in C (client and server are 2<br>
applications), I see that the application performs an order of<br>
magnitude better for the sync solution (86Kpkts/sec) and 100 times<br>
better (700Kpkts/sec) for the async version.<br>
The code for this is also available in the repo on bitbucket.<br>
<br>
I know there this test is only looking to a part of the application<br>
(transport of the data), but I find the difference rather big.<br>
Is this normal or is there something wrong in my Erlang code?<br>
<br>
Thanks.<br>
Regards,<br>
Ronny<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>
</blockquote></div><br></div></div></div>