[erlang-questions] UDP client/server performance

Ronny Meeus ronny.meeus@REDACTED
Tue Aug 14 08:25:23 CEST 2012


Is there any code available that implements a NIF to have access to UDP sockets?
I have found the procket implementation but it looks like it is using
a separate process to communicate with the socket. This sounds like
overkill to me for this test.

Ronny

On Mon, Aug 13, 2012 at 10:29 PM, Ronny Meeus <ronny.meeus@REDACTED> wrote:
> Hello
>
> I did a quick check.
> - The values between 2 machines are comparable for Erlang.
> - For the C code there is a difference: the async version drops from
> 700Kpks/sec to 400Kpks/sec while the sync version drops from
> 86Kpkts/sec to 10Kpkts/sec.
>
>
> On Mon, Aug 13, 2012 at 9:42 PM, JD Bothma <jbothma@REDACTED> wrote:
>> I'm curious:
>>
>> What are the numbers like (c versus erlang) when it's between two
>> physical machines? Or between two (vmware or virtualbox, not xen)
>> virtual machines?
>>
>> Or said otherwise: does the fact that it's the same machine, network
>> stack and loopback interface affect the comparison between c and
>> erlang?
>>
>> JD
>>
>> On 13 August 2012 21:11, Ronny Meeus <ronny.meeus@REDACTED> wrote:
>>> Hello
>>>
>>> I have created a simple UDP based client/server application.
>>> The code is available on bitbucket
>>> (https://bitbucket.org/meeusr/erl-examples) in the networking
>>> directory.
>>>
>>> The server is just an echo server running in 1 process.
>>> The client can behave like a sync client (sending 1 message and
>>> waiting for the reply) or like an async client (sending X messages
>>> before waiting for all the replies).
>>> I see that my PC (Intel(R) Quad code i7 CPU 860  @ 2.80GHz) is able to
>>> process something like 7K - 10K messages per second. Both the sync and
>>> the async are in the same order of magnitude. Please note that I use
>>> the loopback interface.
>>>
>>> $ erl +sbt db
>>> Erlang R15B01 (erts-5.9.1) [source] [64-bit] [smp:4:4]
>>> [async-threads:0] [hipe] [kernel-poll:false]
>>>
>>> Eshell V5.9.1  (abort with ^G)
>>> 1> c(gen_udp_test).
>>> gen_udp_test.erl:47: Warning: variable 'Data' is unused
>>> gen_udp_test.erl:47: Warning: variable 'Msg' is unused
>>> gen_udp_test.erl:62: Warning: variable 'Data' is unused
>>> gen_udp_test.erl:62: Warning: variable 'Msg' is unused
>>> {ok,gen_udp_test}
>>> 2> gen_udp_test:start_server().
>>> true
>>> ...
>>> 12> gen_udp_test:client_async(5000).
>>> stop : 841482
>>> ok
>>> 13> gen_udp_test:client_async(6000).
>>> stop : 1082679
>>> ok
>>>
>>> The timings are the number of usec for the processing of the X number
>>> of messages (round-trip).
>>>
>>> If I implement the same application in C (client and server are 2
>>> applications), I see that the application performs an order of
>>> magnitude better for the sync solution (86Kpkts/sec) and 100 times
>>> better (700Kpkts/sec) for the async version.
>>> The code for this is also available in the repo on bitbucket.
>>>
>>> I know there this test is only looking to a part of the application
>>> (transport of the data), but I find the difference rather big.
>>> Is this normal or is there something wrong in my Erlang code?
>>>
>>> Thanks.
>>> Regards,
>>> Ronny
>>> _______________________________________________
>>> erlang-questions mailing list
>>> erlang-questions@REDACTED
>>> http://erlang.org/mailman/listinfo/erlang-questions



More information about the erlang-questions mailing list