[nodejs] Re: Anonymous functions garbage collection

2012-09-14 Thread dhruvbird
Hello Maxim,

The real reason jslint gives you a warning is if you were to use the loop 
variable i within the function in the closure, you would always get the 
value of i to be a.length (assuming that the function isn't evaluated 
synchronously and that you don't have another function declared within the 
first one).

The code as you have shown seems to be perfectly safe to use though.

I wouldn't worry too much about the performance unless you profile it and 
determine it to be a bottleneck.

Regards,
-Dhruv.

On Thursday, September 13, 2012 2:00:42 AM UTC-4, Maxim Kazantsev wrote:

 It is a pretty typical approach to use an anonymous function for 
 asynchronous calls from inside a loop:

 var a = getInitialData();
 for (var i = 0, len = a.length; i  len; i++) {
   (function(el) {
 /* do something non-blocking here */
   })(a[i]);
 }


 JSLint doesn't like this code with Don't make functions within a loop 
 warning, and it is actually right since it really creates a new anonymous 
 function on every single loop iteration. An obvious solution is to declare 
 this function outside a loop, but it would make a code less readable. Even 
 if a declaration would just precede the loop: you see a call here, you see 
 a declaration somewhere else, and here you are, lost all your attention.

 My question is how bad this approach is for an overall performance? In 
 particular, how fast and efficient a garbage collection of anonymous 
 functions is? How much memory a typical anonymous function can consume and 
 how long it may exist in a memory?


-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups nodejs group.
To post to this group, send email to nodejs@googlegroups.com
To unsubscribe from this group, send email to
nodejs+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en


Re: [nodejs] Re: Anonymous functions garbage collection

2012-09-14 Thread Shripad K
Why not use recursive functions?

var a = getInitialData();

function doSomething(el, i) {
   if(i  a.length) {
/* do something non-blocking here*/
   doSomething(a[i+1], i+1);
   }
}

doSomething(a[0], 0);

On Sat, Sep 15, 2012 at 12:00 AM, dhruvbird dhruvb...@gmail.com wrote:

 Hello Maxim,

 The real reason jslint gives you a warning is if you were to use the loop
 variable i within the function in the closure, you would always get the
 value of i to be a.length (assuming that the function isn't evaluated
 synchronously and that you don't have another function declared within the
 first one).

 The code as you have shown seems to be perfectly safe to use though.

 I wouldn't worry too much about the performance unless you profile it and
 determine it to be a bottleneck.

 Regards,
 -Dhruv.


 On Thursday, September 13, 2012 2:00:42 AM UTC-4, Maxim Kazantsev wrote:

 It is a pretty typical approach to use an anonymous function for
 asynchronous calls from inside a loop:

 var a = getInitialData();
 for (var i = 0, len = a.length; i  len; i++) {
   (function(el) {
 /* do something non-blocking here */
   })(a[i]);
 }


 JSLint doesn't like this code with Don't make functions within a loop
 warning, and it is actually right since it really creates a new anonymous
 function on every single loop iteration. An obvious solution is to declare
 this function outside a loop, but it would make a code less readable. Even
 if a declaration would just precede the loop: you see a call here, you see
 a declaration somewhere else, and here you are, lost all your attention.

 My question is how bad this approach is for an overall performance? In
 particular, how fast and efficient a garbage collection of anonymous
 functions is? How much memory a typical anonymous function can consume and
 how long it may exist in a memory?

  --
 Job Board: http://jobs.nodejs.org/
 Posting guidelines:
 https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
 You received this message because you are subscribed to the Google
 Groups nodejs group.
 To post to this group, send email to nodejs@googlegroups.com
 To unsubscribe from this group, send email to
 nodejs+unsubscr...@googlegroups.com
 For more options, visit this group at
 http://groups.google.com/group/nodejs?hl=en?hl=en


-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups nodejs group.
To post to this group, send email to nodejs@googlegroups.com
To unsubscribe from this group, send email to
nodejs+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en


Re: [nodejs] Re: Anonymous functions garbage collection

2012-09-14 Thread Stewart Mckinney
I'm not really sure that the define outside of loop form is actually less
readable, but I have a suspicion that Crankshaft ( V8's optimizing pipeline
) would notice that you are redefining/executing the same function in the
loop ( since there is no branch statement ) and optimize the definition out
of the loop.

Would be nice to get some benchmarks to confirm that though. I would
probably define the method outside anyway because personally I find that
more readable - its easier for me to read doTask() in a loop.

On Fri, Sep 14, 2012 at 3:42 PM, Shripad K assortmentofso...@gmail.comwrote:

 Why not use recursive functions?

 var a = getInitialData();

 function doSomething(el, i) {
if(i  a.length) {
 /* do something non-blocking here*/
doSomething(a[i+1], i+1);
}
 }

 doSomething(a[0], 0);

 On Sat, Sep 15, 2012 at 12:00 AM, dhruvbird dhruvb...@gmail.com wrote:

 Hello Maxim,

 The real reason jslint gives you a warning is if you were to use the loop
 variable i within the function in the closure, you would always get the
 value of i to be a.length (assuming that the function isn't evaluated
 synchronously and that you don't have another function declared within the
 first one).

 The code as you have shown seems to be perfectly safe to use though.

 I wouldn't worry too much about the performance unless you profile it and
 determine it to be a bottleneck.

 Regards,
 -Dhruv.


 On Thursday, September 13, 2012 2:00:42 AM UTC-4, Maxim Kazantsev wrote:

 It is a pretty typical approach to use an anonymous function for
 asynchronous calls from inside a loop:

 var a = getInitialData();
 for (var i = 0, len = a.length; i  len; i++) {
   (function(el) {
 /* do something non-blocking here */
   })(a[i]);
 }


 JSLint doesn't like this code with Don't make functions within a loop
 warning, and it is actually right since it really creates a new anonymous
 function on every single loop iteration. An obvious solution is to declare
 this function outside a loop, but it would make a code less readable. Even
 if a declaration would just precede the loop: you see a call here, you see
 a declaration somewhere else, and here you are, lost all your attention.

 My question is how bad this approach is for an overall performance? In
 particular, how fast and efficient a garbage collection of anonymous
 functions is? How much memory a typical anonymous function can consume and
 how long it may exist in a memory?

  --
 Job Board: http://jobs.nodejs.org/
 Posting guidelines:
 https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
 You received this message because you are subscribed to the Google
 Groups nodejs group.
 To post to this group, send email to nodejs@googlegroups.com
 To unsubscribe from this group, send email to
 nodejs+unsubscr...@googlegroups.com
 For more options, visit this group at
 http://groups.google.com/group/nodejs?hl=en?hl=en


  --
 Job Board: http://jobs.nodejs.org/
 Posting guidelines:
 https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
 You received this message because you are subscribed to the Google
 Groups nodejs group.
 To post to this group, send email to nodejs@googlegroups.com
 To unsubscribe from this group, send email to
 nodejs+unsubscr...@googlegroups.com
 For more options, visit this group at
 http://groups.google.com/group/nodejs?hl=en?hl=en


-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups nodejs group.
To post to this group, send email to nodejs@googlegroups.com
To unsubscribe from this group, send email to
nodejs+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en


[nodejs] Re: Anonymous functions garbage collection

2012-09-13 Thread greelgorke
well. you have to understand why this is done in this way. the immediate 
function is used here to create scope, so every closure created has access 
to the right value. w/o this construct every of all a.lenght clojures will 
acces the same value: a[a.length-1].

i do not agree that defining a function somewhere else decrease 
readability, its the opposite. if i declare well named, pure function i 
increase readability, plus, reusability, reduce my memory footprint and 
garbage collection effort.

Am Donnerstag, 13. September 2012 08:00:42 UTC+2 schrieb Maxim Kazantsev:

 It is a pretty typical approach to use an anonymous function for 
 asynchronous calls from inside a loop:

 var a = getInitialData();
 for (var i = 0, len = a.length; i  len; i++) {
   (function(el) {
 /* do something non-blocking here */
   })(a[i]);
 }


 JSLint doesn't like this code with Don't make functions within a loop 
 warning, and it is actually right since it really creates a new anonymous 
 function on every single loop iteration. An obvious solution is to declare 
 this function outside a loop, but it would make a code less readable. Even 
 if a declaration would just precede the loop: you see a call here, you see 
 a declaration somewhere else, and here you are, lost all your attention.

 My question is how bad this approach is for an overall performance? In 
 particular, how fast and efficient a garbage collection of anonymous 
 functions is? How much memory a typical anonymous function can consume and 
 how long it may exist in a memory?


-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups nodejs group.
To post to this group, send email to nodejs@googlegroups.com
To unsubscribe from this group, send email to
nodejs+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en