Maintenance: Planio will be observing a scheduled maintenance window this Sunday, November 10, 2024 from 20:00 UTC until 21:00 UTC to perform important network maintenance in our primary data center. Your Planio account will be unavailable for a few minutes during this maintenance window.
Bug #5925
closedPerformance: dynamic function lookup runs very slowly under Saxon-JS
100%
Description
This is a strange performance issue.
I have tried to boil this down, but when I do so, the performance problem evaporates so I'm afraid there is a huge wodge of code here, for which I apologize.
When I run this stylesheet in XSLT, it runs in a few seconds. This is a direct translation of some XQuery code, which also runs in seconds. In node (or a browser), however it takes over a minute. If I run the full set of tests it takes 11 hours to run instead of half a minute.
I ran some basic profiling: it seems to be killing itself with GC if I'm reading this right. (see profile20230317.txt)
The script go.sh is how I'm running this; obviously all the paths and whatnot would need fixing. It is Saxon 12.0 to do the export to JSON and then xslt3.js to run it.
Saxon-JS 2.5, Saxon 12.0
Files
Updated by Norm Tovey-Walsh over 1 year ago
Thanks, Mary. I'll try to look at this next week.
Updated by Michael Kay over 1 year ago
John Lumley points out that the example makes extensive use of packages. We may need to take a look at the SaxonJS code for binding cross-package component references (such as function calls), which has probably not been stress-tested.
Updated by Norm Tovey-Walsh over 1 year ago
- Status changed from New to Resolved
- Applies to JS Branch Trunk added
- Fix Committed on JS Branch Trunk added
A quick review of the profile pointed me to the code for dynamic function lookup. The test case does more than 600 lookups but only actually calls 5 functions. So we were doing ~595 unnecessary lookups. That's a linear search (I think) through all of the possible functions. Rather than trying to make a more complex data structure, I simply added a cache. The test case is now 13x faster and finishes easily in a couple of seconds.
The patch didn't apply cleanly to the saxonjs2
branch so I haven't ported it. If we end up doing another Saxon2 release, we should.
Updated by Michael Kay about 1 year ago
- Subject changed from Performance: XSL runs very slowly under Saxon-JS to Performance: dynamic function lookup runs very slowly under Saxon-JS
Updated by Norm Tovey-Walsh about 1 year ago
- Fix Committed on JS Branch 2 added
Patch applied to the saxonjs2 branch
Updated by Debbie Lockett about 1 year ago
- Status changed from Resolved to Closed
- % Done changed from 0 to 100
- Fixed in JS Release set to SaxonJS 2.6
Bug fix applied in the SaxonJS 2.6 maintenance release.
Please register to edit this issue
Also available in: Atom PDF Tracking page