From b7372fe7cde5e5b3f30c584f8efc34b7539d39da Mon Sep 17 00:00:00 2001 From: Mike Gerwitz Date: Thu, 12 Oct 2023 10:29:14 -0400 Subject: [PATCH] current/compiler/js-calc.xsl (compile-calc-value): Drastically reduce matching complexity This takes a bunch of individual templates and combines them into one, while also utilizing the already-available symbol table map in place of using an XPath on `preproc:symtable`. The results are much more drastic than I was expecting. I was exploring this because one of our largest packages was spending most of its time (~5m) in fragment compilation, which was a surprise to me. Prior work I did for runtime optimizations led to optimizations in its parent `js.xsl`, but not in `js-calc.xsl`, which has largely been untouched since it was originally written for XSLT 1 over 10 years ago. Because it was originally written for XLST 1, it does not take advantage of maps, tunneling variables, or various other options. Further, it was written in a naive way that was convenient (and clear) at the time, and wholly acceptable for smaller inputs. But, as is the case with quadratic-time systems, there are severe growing pains. This change reduced the package compilation time from 5-6m down to 1m15s, and this was just the first attempt at optimizing it. I should have taken a look at this long ago, but my efforts were focused on TAMER, and I didn't want to divert that focus. That was a mistake. Symptoms of this problem were already prevalent ~10 months ago, when the package was taking 3 minutes to compile (so the time has since doubled). This also eliminates `@magic`, which has not been used for a long time (it used to be used for a "constant" that held the current date/time; such a value is now passed into the system like any other input). After making this change, the resulting packages are byte-for-byte identical. I also noticed, though I haven't tried to measure it, that there seem to be fewer multi-core spikes; this is possibly related to Saxon not trying to evaluate expensive `template/match` expressions concurrently anymore. If true, this will also help with resource contention for parallel builds. DEV-15095 --- src/current/compiler/js-calc.xsl | 280 ++++++++++++------------------- 1 file changed, 105 insertions(+), 175 deletions(-) diff --git a/src/current/compiler/js-calc.xsl b/src/current/compiler/js-calc.xsl index d29dc0ab..f011ed62 100644 --- a/src/current/compiler/js-calc.xsl +++ b/src/current/compiler/js-calc.xsl @@ -502,196 +502,126 @@ + + - - - - - - - - - - - - - - - - - -