Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

What if you compiled it something like this:

  for i in [a...b]
becomes

  if(a <= b) {
      for(i = a; i < b; i++) {
          // Code
      }
  } else {
      for(i = a; i > b; i--) {
          // Code again
      }
  }
Or otherwise moved the extra conditions outside the loop so they only get computed once?


Unfortunately, that requires repeating the entire body of the loop, and so isn't workable/acceptable for our purposes. If you'd like to see the original conversation that led to the current compilation, it's all available on the GitHub issues.


I'll have a look for the discussion. Any idea if the branches are more expensive than some multiplies?

    step = (a<=b)?1:-1;
    for (i = a; step*i < step*b; i += step) {
      doSomething();
    }
I guess if the branch predictor is any good it could be slower with multiplies, but I have no idea what to expect in a dynamic language.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: