-
Notifications
You must be signed in to change notification settings - Fork 29.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Decreased performance in code running in Temporal Dead Zone #12568
Comments
cc @nodejs/performance @nodejs/v8 |
Maybe @caitp has already fixed this with... v8/v8@267115d Benchmarks: v8/v8@e2670e8 |
That fix should lead to improved perf (matching or beating
In the other cases, even the opt case seems to do worse than the opt case in var loops, so there's more work to do still. |
Relate to http://stackoverflow.com/questions/37792934/why-is-let-slower-than-var-in-a-for-loop-in-nodejs I suggest using |
I'm getting similar results with Node.js 8.2.1 but radically different results with the master branch which has V8 6.0 currently (and which will come out in Node.js 8.3.0 Very Soon Now). Is this resolved in V8 6.0? (Since this is a V8 issue, should this issue remain open in this repository?) |
I tested with 8.3.0-rc.0 and the speed is the same in all cases. I think we can consider this as resolved by the V8 6.0 upgrade. |
**I have created a detailed Stack Overflow question here so I will quote it here to get some answers since I do not know the internal mechanichs...
Quoted Question:
I have noticed in an other question the performance difference in loops while using
let
andvar
variables declaration.The initial question is correctly answered that using
let
in the for loop is slower sincelet
creates a new scope for each iteration to hold the value oflet
declared variable. More work to be done, so it is normal to be slower. Just as reference, I give the code and the results in NodeJS (7.9.0) execution time:Please note that all javascript code below regards NodeJS version 7.9.0
Regular Code:
Output:
In order to avoid the extra scope declaration for
j
in every iteration of the loop, we declare thej
variable just before the loop. One would expect that this should now make thelet
loop performance match the one ofvar
. BUT NO!!! This is the code and the result for reference:Code with
let
defined before loop:Output:
We can see that, not only the
let
loop did not get any faster but also thevar
loop became as slow as thelet
one!!! The only explanation for this is that since we are not in any block or function, both variables are declared in the global module scope. However as referenced here, thelet
declaration of the variable in the middle of the scope, creates a temporal dead zone, which leaves the variablej
uninitialized, while thevar
initializes the variable as defined.So running code in a temporal dead zone although the uninitialized variable is not referenced, must be quite slower....
Finally to show the deference, we declare the
j
variable on top of the program to show the results of running it without the temporal dead zone.Code without temporal dead zone:
Output:
Now both
let
andvar
loops have similar optimized performance!Does anyone know whether my assumption about temporal dead zone performance is correct, or provide a different explanation???
The text was updated successfully, but these errors were encountered: