最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

performance - javascript 'let' and 'var' in for-loops - Stack Overflow

programmeradmin4浏览0评论

On my search for concrete numbers to back usage of the const keyword in Javascript, I stumbled upon a performance parision between all three variable declaration types var, let and const. I didn't like the test setup, so I created a simplified one.

I didn't expect much difference and Firefox measured up to my expectations:

But in Chromium something weird happened:

Not only are all test results significantly lower but let inside the loop breaks down to a fraction of the speed.

I decided to run the tests in Browserstack to make sure it is not my quirky Linux setup. The same happens there with Firefox 53 and Chrome 58 on Windows 10. I even tested the somewhat older Chrome 50 and got the same behaviour.

What is going on? Is it a bug?

EDIT: Some mented that the loop is probably just optimized away as it is doing nothing. To show, that this is not the case, I changed the test.

On my search for concrete numbers to back usage of the const keyword in Javascript, I stumbled upon a performance parision between all three variable declaration types var, let and const. I didn't like the test setup, so I created a simplified one.

I didn't expect much difference and Firefox measured up to my expectations:

But in Chromium something weird happened:

Not only are all test results significantly lower but let inside the loop breaks down to a fraction of the speed.

I decided to run the tests in Browserstack to make sure it is not my quirky Linux setup. The same happens there with Firefox 53 and Chrome 58 on Windows 10. I even tested the somewhat older Chrome 50 and got the same behaviour.

What is going on? Is it a bug?

EDIT: Some mented that the loop is probably just optimized away as it is doing nothing. To show, that this is not the case, I changed the test.

Share Improve this question edited May 9, 2017 at 9:05 koehr asked May 8, 2017 at 12:36 koehrkoehr 7791 gold badge10 silver badges21 bronze badges 5
  • Are you sure Firefox isn't just optimizing the code? None of those code blocks actually do anything so could be the reason they are similar in speed. – CodingIntrigue Commented May 8, 2017 at 12:57
  • "I created a simplified one." You essentially removed the whole test. You created a loop that does nothing and therefore gets optimized away. "let inside" doesn't even have side effects, that's why it's the "fastest" one. Chrome's engine doesn't seem to optimize this particular case. – a better oliver Commented May 8, 2017 at 13:07
  • @CodingIntrigue: I thought about this but running an empty loop would result in significantly higher numbers (around 18 Million on my machine). – koehr Commented May 8, 2017 at 13:22
  • possible duplicate of Why is let slower than var in a for loop in nodejs? – Bergi Commented May 17, 2017 at 23:26
  • I think this is very engine specific. In Edge 15.15063.0 / Windows 10 0.0.0, there seems to be no statistically significant difference between the tests, with net speeds parable to Chrome. – Burt_Harris Commented May 17, 2017 at 23:39
Add a ment  | 

2 Answers 2

Reset to default 3

When you use let the body of the for loop must create a new scope to handle the correct lifetime for the loop variable, however in many cases it is possible to optimise away the extra code and runtime. For example consider this code:

let sum = 0;
let fns = [];
for (let i=0; i < 1000; i++) {
  function foo() { sum += i; }

  fns.push(foo);

}

When you run it through babeljs you can see the equivalent ES5 code it produces includes a function call in order to preserve the correct variable lifetimes:

var sum = 0;
var fns = [];

var _loop = function _loop(i) {
  function foo() {
    sum += i;
  }

  fns.push(foo);
};

for (var i = 0; i < 1000; i++) {
  _loop(i);
}

However, babel is intelligent enough that if you don't do anything which requires extending the lifetime of the loop variable it simply uses an ordinary for loop with the body inline. So your code:

for (let i=0; i < 1000; i++) {
  true;
}

can be shown to be exactly equivalent to:

for (var i=0; i < 1000; i++) {
  true;
}

My guess would be that something very similar happens internally in Chrome, but they haven't yet optimised out the cases where they don't have to keep the loop variable alive.

It would be interesting to see how the code I used at the top of this example pares in Firefox and Chrome as I suspect they should both end up similarly slow. You should beware of timing things like empty loops as the results can be skewed by optimisation far more than is normal for actual code.

It's because the let keyword is somewhat new to the specification and is only applicable to the local scope. In Chrome it doesn't seem to be optimized yet, but that should only be a matter of time.

发布评论

评论列表(0)

  1. 暂无评论