[erlang-questions] node.js vs erlang

Pedro Narciso García Revington p.revington@REDACTED
Tue Jun 17 15:17:51 CEST 2014


Hey Joe

Node is very popular so I'm trying to understand what it is about node that
> is attractive.


Lots of people already know js, so it seems an easy platform to get in.

What I love about node:

   - npm
   - modules ecosystem
   - easy to deploy
   - easy to start: you can use js, you do not need a specific ide, easy to
   install, good documentation, and examples
   - tjhollowaychuck:
   this guy have made lots of projects that makes your life easier:
   express, mocha, jade, supertest, commander.
   Lots of examples, simplicity, elegant design and good documentation
   https://github.com/visionmedia
   - You can develop applications very fast due to javascripts nature
   (dynamic typing, closures, easy introspection, prototype inheritance)




2014-06-17 14:41 GMT+02:00 Joe Armstrong <erlang@REDACTED>:

>
> 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/97f9b2c3/attachment.htm>


More information about the erlang-questions mailing list