<div dir="ltr"><div>"Node is very popular so I'm trying to understand what it is about node that is attractive."</div><div><br></div><div>Having recently moved from Node.js (JavaScript really) to Erlang, a few things come to mind:</div>
<div>1. a lot of browser frontend (i.e. JavaScript) developers almost don't have to learn anything new to develop server-side code using Node.js</div><div>2. npm (for sure) is one of the best package management systems I've used... really simple (oh, and the fact that you can use specific versions of deps in your app and not be restricted by a previous choice, sure helps a lot)</div>
<div>3. <a href="http://npmjs.org">npmjs.org</a> :D</div><div>4. the debugger (node-inspector): I miss this :(</div><div>5. you can share server-side and browser-side code</div><div><br></div><div>On the other hand, for high concurrency, I wouldn't recommend it (it's heavy when you have to spawn a few thousand processes to do _parallel_ and then the OS can't easily cope with this), as it's single threaded (ok, there's Cluster, but...). And also, the fact that tail recursion is non-existing...</div>
<div><br></div><div>At the moment, though, I enjoy prototyping with Node.js and implementing with Erlang. :)</div><div><br></div><div>- Paulo F. Oliveira</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">
On 17 June 2014 13:41, Joe Armstrong <span dir="ltr"><<a href="mailto:erlang@gmail.com" target="_blank">erlang@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jun 17, 2014 at 2:05 PM, Darach Ennis <span dir="ltr"><<a href="mailto:darach@gmail.com" target="_blank">darach@gmail.com</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi all,<div><br></div><div>For this to be comparable both Erlang and Node.js need to be running</div><div>


similarly. I don't see how a concurrent Erlang runtime with multiple schedulers</div><div>can be compared with a single-threaded Node.js implementation objectively or</div>
<div>fairly...</div><div><br></div></div></blockquote><div><br></div><div>It's actually the programming models I want to compare and not the</div><div>performance - what worries me about node is the run-to-completion</div>


<div>semantics of event callbacks - namely that a long-running event will block</div><div>the server preventing short computations from being performed. The</div><div>short jobs which could be done immediately have to wait until the long jobs</div>


<div>have finished - this should reflect in the average latencies of a request.</div><div><br></div><div>I made a little experiment (a fibonacci server in erlang and node) and fired off</div><div>1000 parallel requests to compute fib(N) with N a random number from 10..40.</div>


<div><br></div><div>As I suspected many of the fib(10) events are blocked by ongoing computation of</div><div>fib(40) - this reflect in the latencies.</div><div><br></div><div>Node is about 1.6 times faster than Erlang - but the latencies for small computations</div>


<div>are terrible - Erlang never blocks so the response times are more predictable.</div><div><br></div><div>And yes I know that fib can be offloaded to a background processor or parallelised</div><div>in JS with a bit of black magic - but manually converting a long lived computation into</div>


<div>a re-entrant non-blocking version is very difficult.</div><div><br></div><div>The node books say something like "make sure that callbacks run-to-completion quickly"</div><div>I would say that complying with this advice is extremely difficult. It's very difficult to guess</div>


<div>which computations will take a long time, and even if you know it's difficult to break them into</div><div>small re-entrant chunks.</div><div><br></div><div>Node is very popular so I'm trying to understand what it is about node that is attractive.</div>


<div>npm for example, looks well engineered and something we could learn from. The node</div><div>web servers are easy to setup and run, so I'd like to see if we could make equally </div><div>easy to use Erlang servers.</div>


<div><br></div><div>Performance is not a primary concern - easy of programming and correctness are.</div><div><br></div><div>Cheers</div><div><br></div><div>/Joe</div><div><br></div><div><br></div><div><br></div><div><br>

</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div></div><div>Using node cluster with the same number of cluster instances as erlang</div><div>schedulers might be a fairer environment for comparison. However, as</div><div>numeric computations are fairly efficient in Node.js and inefficient in Erlang</div>



<div>relative to Java or C it may take a few iterations to get a fair comparison</div><div>in place. Node cluster is a standard part of node.js:</div><div><br></div><div><a href="http://nodejs.org/api/cluster.html" target="_blank">http://nodejs.org/api/cluster.html</a><br>



</div><div><br></div><div>There are various attempts at implementing fibers and lightweight threads</div><div>in Node.js (eg: <a href="https://github.com/laverdet/node-fibers/" target="_blank">https://github.com/laverdet/node-fibers/</a>) but there is nothing</div>



<div>common here. This would approximate an erlang runtime more closely at</div><div>the cost of deviating a little from a commonly found node runtime... Ho hum.</div><div><br></div><div>As javascript runtimes start to adopt vectorized instructions and other</div>



<div>optimisations their speed relative to a C baseline has and will continue to</div><div>steadily improve and has been for a number of years, especially with V8.</div><div><br></div><div>Good luck with the benchmarking!</div>



<div><br></div><div>Cheers,</div><div><br></div><div>Darach.</div></div><div class="gmail_extra"><br><br><div class="gmail_quote"><div><div>On Tue, Jun 17, 2014 at 12:48 PM, Joe Armstrong <span dir="ltr"><<a href="mailto:erlang@gmail.com" target="_blank">erlang@gmail.com</a>></span> wrote:<br>



</div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div><div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Jun 17, 2014 at 1:00 PM, Greg Young <span dir="ltr"><<a href="mailto:gregoryyoung1@gmail.com" target="_blank">gregoryyoung1@gmail.com</a>></span> wrote:<br>




<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Are you testing against single threaded node or one of the clustered versions or multiple processes or?</div>




<div><div><div class="gmail_extra"><br><br></div></div></div></blockquote><div><br></div><div>Single threaded</div><span><font color="#888888"><div><br></div><div>/Joe</div></font></span><div><div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><div><div class="gmail_extra"><div class="gmail_quote">On Tue, Jun 17, 2014 at 1:19 PM, Joe Armstrong <span dir="ltr"><<a href="mailto:erlang@gmail.com" target="_blank">erlang@gmail.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><br><br><div class="gmail_quote"><div>On Tue, Jun 17, 2014 at 12:10 PM, Greg Young <span dir="ltr"><<a href="mailto:gregoryyoung1@gmail.com" target="_blank">gregoryyoung1@gmail.com</a>></span> wrote:<br>






<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Can you really compare the two? :) </div></blockquote><div><br></div></div><div>Yes - there are many things we can measure. Performance, Latency, memory usage and so on.</div>






<div><br></div><div>Right now I'm measuring latency - </div><div><br></div><div>I set up a few thousand parallel processes which request fib(N) and measure the latency of the responses.</div><div><br></div><div>the results will be published when I understand them :-)</div>





<span><font color="#888888">
<div><br></div><div>/Joe</div></font></span><div><div><div><br></div><div><br></div><div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div class="gmail_extra">
<br><br><div class="gmail_quote"><div><div>On Mon, Jun 16, 2014 at 5:55 PM, Juan Facorro <span dir="ltr"><<a href="mailto:juan.facorro@gmail.com" target="_blank">juan.facorro@gmail.com</a>></span> wrote:<br>

</div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div><div dir="ltr">Hi Joe,<div><br></div><div>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.</div>







<div><br></div><div>HTH,</div><div><br></div><div>J</div><div><br>On Monday, June 16, 2014 11:22:23 AM UTC-3, Joe Armstrong wrote:<blockquote class="gmail_quote" style="margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex">







<div dir="ltr"><div>I'm trying to compare node.js with erlang. I'm a total node.js novice BTW - but I've written some JS.</div><div><br></div><div>Program 1 is just fibonacci - I want a web server to compute fib(N)</div>








<div><br></div><div>So requesting <a href="http://127.0.0.1:8124/fib?n=2" target="_blank">http://127.0.0.1:8124/fib?n=2</a> should compute and return fib(2)</div><div><br></div><div>My node.js attempt crashes</div><div>Here's the code in fib.js</div>








<div><br></div><div>--- fib.js</div><div><br></div><div><div>var http = require('http');</div><div>var url  = require('url');</div><div><br></div><div>function fib(n) {</div><div>  if (n < 2) {</div><div>








    return 1;</div><div>  } else {</div><div>    return fib(n - 2) + fib(n - 1);</div><div>  }</div><div>}</div><div><br></div><div>http.createServer(function (req, res) {</div><div>    var q = url.parse(req.url, true).query;</div>








<div>    var n = q.n;</div><div>    var result = fib(n);</div><div>    console.log('fib('+ n + ')= '+result);</div><div>    res.writeHead(200, {'Content-Type': 'text/plain'});</div><div>    res.end(result.toString());</div>








<div>}).listen(8124, "127.0.0.1");</div><div><br></div><div>console.log('Server running at <a href="http://127.0.0.1:8124/'" target="_blank">http://127.0.0.1:8124/'</a>);</div></div><div><br></div><div>







-- end</div><div>
<br></div><div>-- now we run it</div><div><div><br></div><div>$ node fib.js</div><div>Server running at <a href="http://127.0.0.1:8124/" target="_blank">http://127.0.0.1:8124/</a></div><div>fib(2)= 2</div><div><br></div>







<div>/home/ejoearm/Dropbox/<u></u>experiments/hello_world/fib.<u></u>js:5</div>
<div>function fib(n) {</div><div>            ^</div><div>RangeError: Maximum call stack size exceeded</div></div><div><br></div><div>fib(2) has run out of stack space????</div><div><div><br></div><div>$ node --version</div>








<div>v0.8.21</div></div><div><br></div><div>Any ideas what I'm doing wrong</div><div><br></div><div>Cheers</div><div><br></div><div>/Joe</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div>








<div><br></div></div><span><font color="#888888">
</font></span></blockquote></div></div></div></div><span><font color="#888888"><span><font color="#888888">

<p></p>

-- <br>
Remember to send a copy to erlang (dot) questions (at) erlang (dot) org when posting.<br>
--- <br>
You received this message because you are subscribed to the Google Groups "Erlang Programming" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an email to <a href="mailto:erlang-programming+unsubscribe@googlegroups.com" target="_blank">erlang-programming+unsubscribe@googlegroups.com</a>.<br>








To post to this group, send email to <a href="mailto:erlang-programming@googlegroups.com" target="_blank">erlang-programming@googlegroups.com</a>.<br>
Visit this group at <a href="http://groups.google.com/group/erlang-programming" target="_blank">http://groups.google.com/group/erlang-programming</a>.<br>
For more options, visit <a href="https://groups.google.com/d/optout" target="_blank">https://groups.google.com/d/optout</a>.<br>
</font></span></font></span></blockquote></div><span><font color="#888888"><br><br clear="all"><span class="HOEnZb"><font color="#888888"><div><br></div>-- <br><div dir="ltr">Studying for the Turing test</div>
</font></span></font></span></div><span class="HOEnZb"><font color="#888888">
</font></span></blockquote></div></div></div><span class="HOEnZb"><font color="#888888"><br></font></span></div></div><span class="HOEnZb"><font color="#888888">
</font></span></blockquote></div><span class="HOEnZb"><font color="#888888"><br><br clear="all"><div><br></div>-- <br><div dir="ltr">Studying for the Turing test</div>
</font></span></div><span class="HOEnZb"><font color="#888888">
</font></span></div></div></blockquote></div></div></div><span class="HOEnZb"><font color="#888888"><br></font></span></div></div><span class="HOEnZb"><font color="#888888">
<br></font></span></div></div><span class="HOEnZb"><font color="#888888"><div>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">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>
<br></div></font></span></blockquote></div><span class="HOEnZb"><font color="#888888"><br></font></span></div>
</blockquote></div><br></div></div>
<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>
<br></blockquote></div><br></div>