vm.compileFunction(source)
is much slower than new vm.Script(source)
#35375
Description
- Version:
v14.12.0
- Platform:
Darwin Simens-MacBook-Pro.local 19.6.0 Darwin Kernel Version 19.6.0: Mon Aug 31 22:12:52 PDT 2020; root:xnu-6153.141.2~1/RELEASE_X86_64 x86_64
- Subsystem:
vm
What steps will reproduce the bug?
See https://github.com/SimenB/vm-script-vs-compile-function and run node index.js
.
It's just yarn init -2
to fetch the bundled yarn v2 source code (to have a large JS file), then loading that into new Script
and compileFunction
100 times and seeing how long it takes.
Running this prints the following on my machine (MBP 2018):
Running with Script took 50 ms
Running with compileFunction took 4041 ms
How often does it reproduce? Is there a required condition?
Every time
What is the expected behavior?
It should be comparably fast to pass source code into compileFunction
as it is to pass it into new Script
.
What do you see instead?
About 80x worse performance. It gets worse the larger the loop is, so I'm assuming it's "simply" some cached data so new Script
avoids the hit of parsing the same code multiple times, as it's fairly constant regardless of loop iterations
Additional information
This might be the same as #26229.
As mentioned in #26229 (comment) we see a huge performance improvement in Jest if we switch from compileFunction
to the "old" new Script
approach. As also mentioned there, this might be "fixed" (or at least possible to solve in userland) by the seemingly stalled #24069?
Activity