On 18/02/11 17:35, bytespider wrote: > for (var i = 0, length = arr.length; i < length; ++i) { ... > Note I also use ++i over i++ because > it's slightly faster on some modern browsers but mostly out of habit.
Okay, now we're firmly in micro-optimization land, but I'm curious... partially because this topic comes up once in a while, and partly because I also tend to use ++i rather than i++ (purely out of habit). This used to be a sensible optimization in C once, a long time ago, but modern compilers like gcc or javac will automatically optimize an expression like this when its return value is not used (I've appended a few examples in case you want to confirm it for yourself). As far as I know, there is no longer any point in preferring pre-increment over post-increment in a for-loop like this. Same thing goes for C++, as long as i is a simple type. Now you say that modern browsers will perform _better_ when you use the pre-incement. Did you actually test this? I tried to verify it with a couple of modern engines, but didn't see any difference. I didn't expect to see any - modern JS engines should have more advanced optimizers than older ones; they should be better able to recognize that the return value won't be used and the expression i++ can be optimized. It seems like most modern engines do this. >From a semantic viewpoint, some people say that ++i expresses the intent more accurately. From a logical viewpoint, using ++i should never be slower than i++, regardless of optimizers. From a pragmatic viewpoint - who cares, they're both fast enough. As I said, I'm just curious. Before I get flamed: this is a purely academic question. I'm certainly not suggesting it has any impact on real life JS performance from our perspective. stefan _____ $ cat pre.c #include <stdio.h> int main () { int i; for (i = 0; i < 5; ++i) { printf("Line %d\n", i); } return 0; } $ cat post.c #include <stdio.h> int main () { int i; for (i = 0; i < 5; i++) { printf("Line %d\n", i); } return 0; } $ cat pre.java class Test { static public void main (String args[]) { int i; for (i = 0; i < 5; ++i) { System.out.printf("Line %d\n", i); } } } $ cat post.java class Test { static public void main (String args[]) { int i; for (i = 0; i < 5; i++) { System.out.printf("Line %d\n", i); } } } $ gcc < pre.c -xc -S -o pre.s - $ md5sum pre.s d9b04afd3a0c5e95d3492459f736e7ec pre.s $ gcc < post.c -xc -S -o post.s - $ md5sum post.s d9b04afd3a0c5e95d3492459f736e7ec post.s $ cp pre.java Test.java $ javac Test.java $ md5sum Test.class c787c1063aa3d4164d9f2b63b7df8fd2 Test.class $ cp -f post.java Test.java $ javac Test.java $ md5sum Test.class c787c1063aa3d4164d9f2b63b7df8fd2 Test.class -- LOAD"Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn!",8,1 RUN! -- To view archived discussions from the original JSMentors Mailman list: http://www.mail-archive.com/jsmentors@jsmentors.com/ To search via a non-Google archive, visit here: http://www.mail-archive.com/jsmentors@googlegroups.com/ To unsubscribe from this group, send email to jsmentors+unsubscr...@googlegroups.com