Improve traverse and parse performance#900
Conversation
Make use of Object.keys rather than for..in + hasOwnProperty, as the latter cannot be optimized by Node and results in deoptimized function calls in the hot path.
Improve traverse and parse performance
|
This is fantastic, thank you! Tested locally and updated the snapshot in dist/r.js with the changes. Noticeable speedup for the tests, looks like it is close to twice as fast to run the node tests with the change. CLA is much appreciated, thank you. If you filled out the Dojo one, the Dojo and jQuery foundations have merged and I'm mid-process for switching over the CLA links. While it should be fine if you used the Dojo form, it is probably best if you also do the jQuery one: https://contribute.jquery.org/CLA/ which applies to other projects like jQuery, lodash, so gives a lot of contribution possibilities for the future. Thank you so much for the analysis and the fix, a great improvement. |
|
You're very welcome! I submitted a jQuery CLA as well to cover the bases. |
|
@petersondrew I am interested to know more about how you went about identifying the bottleneck. I am still new to those kind of tools for node. No worries though if you do not have time, just idle curiosity. I expect if I just did some more google research I would find the answer. |
|
Sure, no problem 😄 If you notice in the first snippet I posted, most of the ticks were spent in Now, it's not necessarily a given that an unoptimized function will kill your performance, even in the hot path, however this particular function created a double whammy. If we dig in further, we can see that (possibly due to the recursion) node continually optimizes and de-optimizes this function over and over when it finds that its assumptions were incorrect: Let me know if you have any other questions. |
|
@petersondrew, this is awesome, thank you very much! Very educational. |
Make use of Object.keys rather than for..in + hasOwnProperty, as the
latter cannot be optimized by Node and results in deoptimized function
calls in the hot path.
Before:
After:
This has a significant impact on cpu time and wall clock performance. Test suites pass as far as I can tell, however the Rhino tests suites hung up on the sourcemap tests (they did on master as well). Not sure if it's required for this change but I have submitted a CLA just in case.