[erlang-questions] Fw: node.js vs erlang

Thomas Lindgren thomasl_erlang@REDACTED
Tue Jun 17 22:18:29 CEST 2014



A couple of years ago, I had a BSc student implement a simple but realistic web service (realistic enough to be a replacement for one we were using in production), in Ruby, Node and Erlang. Ruby was slowest, as expected. Overall, Erlang beat Node. In particular, while they were roughly the same "best" performance, Node had a much greater variation in response latency.

Best,
Thomas




On Tuesday, June 17, 2014 10:06 PM, Thomas Lindgren <thomasl_erlang@REDACTED> wrote:

>
>On Tuesday, June 17, 2014 2:41 PM, Joe Armstrong <erlang@REDACTED> wrote:
> 
>
>>
>>
>>
>>
>>On Tue, Jun 17, 2014 at 2:05 PM, Darach Ennis <darach@REDACTED> wrote:
>>
>>Hi all,
>>>
>>>
>>>For this to be comparable both Erlang and Node.js need to be running
>>>similarly. I don't see how a concurrent Erlang runtime with multiple schedulers
>>>can be compared with a single-threaded Node.js implementation objectively or
>>>fairly...
>>>
>>>
>>
>>
>>It's actually the programming models I want to compare and not the
>>performance - what worries me about node is the run-to-completion
>>semantics of event callbacks - namely that a long-running event will block
>>the server preventing short computations from being performed. The
>>short jobs which could be done immediately have to wait until the long jobs
>>have finished - this should reflect in the average latencies of a request.
>>
>>
>>I made a little experiment (a fibonacci server in erlang and node) and fired off
>>1000 parallel requests to compute fib(N) with N a random number from 10..40.
>>
>>
>>As I suspected many of the fib(10) events are blocked by ongoing computation of
>>fib(40) - this reflect in the latencies.
>>
>>
>>Node is about 1.6 times faster than Erlang - but the latencies for small computations
>>are terrible - Erlang never blocks so the response times are more predictable.
>>
>>
>>And yes I know that fib can be offloaded to a background processor or parallelised
>>in JS with a bit of black magic - but manually converting a long lived computation into
>>a re-entrant non-blocking version is very difficult.
>>
>>
>>The node books say something like "make sure that callbacks run-to-completion quickly"
>>I would say that complying with this advice is extremely difficult. It's very difficult to guess
>>which computations will take a long time, and even if you know it's difficult to break them into
>>small re-entrant chunks.
>>
>>
>>Node is very popular so I'm trying to understand what it is about node that is attractive.
>>npm for example, looks well engineered and something we could learn from. The node
>>web servers are easy to setup and run, so I'd like to see if we could make equally 
>>easy to use Erlang servers.
>>
>>
>>Performance is not a primary concern - easy of programming and correctness are.
>>
>>
>>Cheers
>>
>>
>>/Joe
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> 
>>Using node cluster with the same number of cluster instances as erlang
>>>schedulers might be a fairer environment for comparison. However, as
>>>numeric computations are fairly efficient in Node.js and inefficient in Erlang
>>>relative to Java or C it may take a few iterations to get a fair comparison
>>>in place. Node cluster is a standard part of node.js:
>>>
>>>
>>>http://nodejs.org/api/cluster.html
>>>
>>>
>>>
>>>There are various attempts at implementing fibers and lightweight threads
>>>in Node.js (eg: https://github.com/laverdet/node-fibers/) but there is nothing
>>>common here. This would approximate an erlang runtime more closely at
>>>the cost of deviating a little from a commonly found node runtime... Ho hum.
>>>
>>>
>>>As javascript runtimes start to adopt vectorized instructions and other
>>>optimisations their speed relative to a C baseline has and will continue to
>>>steadily improve and has been for a number of years, especially with V8.
>>>
>>>
>>>Good luck with the benchmarking!
>>>
>>>
>>>Cheers,
>>>
>>>
>>>Darach.
>>>
>>>
>>>
>>>On Tue, Jun 17, 2014 at 12:48 PM, Joe Armstrong <erlang@REDACTED> wrote:
>>>
>>>
>>>>
>>>>
>>>>
>>>>
>>>>On Tue, Jun 17, 2014 at 1:00 PM, Greg Young <gregoryyoung1@REDACTED> wrote:
>>>>
>>>>Are you testing against single threaded node or one of the clustered versions or multiple processes or?
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>>Single threaded
>>>>
>>>>
>>>>/Joe
>>>> 
>>>>On Tue, Jun 17, 2014 at 1:19 PM, Joe Armstrong <erlang@REDACTED> wrote:
>>>>>
>>>>>
>>>>>>
>>>>>>
>>>>>>On Tue, Jun 17, 2014 at 12:10 PM, Greg Young <gregoryyoung1@REDACTED> wrote:
>>>>>>
>>>>>>Can you really compare the two? :) 
>>>>>>
>>>>>>
>>>>>>Yes - there are many things we can measure. Performance, Latency, memory usage and so on.
>>>>>>
>>>>>>
>>>>>>Right now I'm measuring latency - 
>>>>>>
>>>>>>
>>>>>>I set up a few thousand parallel processes which request fib(N) and measure the latency of the responses.
>>>>>>
>>>>>>
>>>>>>the results will be published when I understand them :-)
>>>>>>
>>>>>>
>>>>>>/Joe
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> 
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>On Mon, Jun 16, 2014 at 5:55 PM, Juan Facorro <juan.facorro@REDACTED> wrote:
>>>>>>>
>>>>>>>Hi Joe,
>>>>>>>>
>>>>>>>>
>>>>>>>>There's a semicolon missing after the declaration of fib(), which for some reason, causes the stack overflow. After adding it the error went away.
>>>>>>>>
>>>>>>>>
>>>>>>>>HTH,
>>>>>>>>
>>>>>>>>
>>>>>>>>J
>>>>>>>>
>>>>>>>>On Monday, June 16, 2014 11:22:23 AM UTC-3, Joe Armstrong wrote:
>>>>>>>>I'm trying to compare node.js with erlang. I'm a total node.js novice BTW - but I've written some JS.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>Program 1 is just fibonacci - I want a web server to compute fib(N)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>So requesting http://127.0.0.1:8124/fib?n=2 should compute and return fib(2)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>My node.js attempt crashes
>>>>>>>>>Here's the code in fib.js
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>--- fib.js
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>var http = require('http');
>>>>>>>>>var url  = require('url');
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>function fib(n) {
>>>>>>>>>  if (n < 2) {
>>>>>>>>>    return 1;
>>>>>>>>>  } else {
>>>>>>>>>    return fib(n - 2) + fib(n - 1);
>>>>>>>>>  }
>>>>>>>>>}
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>http.createServer(function (req, res) {
>>>>>>>>>    var q = url.parse(req.url, true).query;
>>>>>>>>>    var n = q.n;
>>>>>>>>>    var result = fib(n);
>>>>>>>>>    console.log('fib('+ n + ')= '+result);
>>>>>>>>>    res.writeHead(200, {'Content-Type': 'text/plain'});
>>>>>>>>>    res.end(result.toString());
>>>>>>>>>}).listen(8124, "127.0.0.1");
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>console.log('Server running at http://127.0.0.1:8124/');
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>-- end
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>-- now we run it
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>$ node fib.js
>>>>>>>>>Server running at http://127.0.0.1:8124/
>>>>>>>>>fib(2)= 2
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>/home/ejoearm/Dropbox/experiments/hello_world/fib.js:5
>>>>>>>>>function fib(n) {
>>>>>>>>>            ^
>>>>>>>>>RangeError: Maximum call stack size exceeded
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>fib(2) has run out of stack space????
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>$ node --version
>>>>>>>>>v0.8.21
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>Any ideas what I'm doing wrong
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>Cheers
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>/Joe
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> -- 
>>>>>>>>Remember to send a copy to erlang (dot) questions (at) erlang (dot) org when posting.
>>>>>>>>--- 
>>>>>>>>You received this message because you are subscribed to the Google Groups "Erlang Programming" group.
>>>>>>>>To unsubscribe from this group and stop receiving emails from it, send an email to erlang-programming+unsubscribe@REDACTED
>>>>>>>>To post to this group, send email to erlang-programming@REDACTED
>>>>>>>>Visit this group at http://groups.google.com/group/erlang-programming.
>>>>>>>>For more options, visit https://groups.google.com/d/optout.
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>-- 
>>>>>>>
>>>>>>>Studying for the Turing test
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>>-- 
>>>>>
>>>>>Studying for the Turing test
>>>>
>>>>
>>>>_______________________________________________
>>>>erlang-questions mailing list
>>>>erlang-questions@REDACTED
>>>>http://erlang.org/mailman/listinfo/erlang-questions
>>>>
>>>>
>>>
>>
>>
>>
>>_______________________________________________
>>erlang-questions mailing list
>>erlang-questions@REDACTED
>>http://erlang.org/mailman/listinfo/erlang-questions
>>
>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20140617/c8170014/attachment.htm>


More information about the erlang-questions mailing list